1 原子操作
原子操作:一个独立不可分割的操作。多线程编程需要保证线程安全,而线程安全一个很重要的特性就是原子性,即在同一时刻只有一个线程对原子进行操作,保证数据访问的互斥性。
2 C++11原子变量
C++11提供了原子类型std::atomic
3 使用原子变量
3.1 没有使用线程互斥的数据操作
#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include <vector>
#include <chrono>
long long globalCount = 0;
void ThreadFunction()
{
for (int i=0;i<100000;++i)
{
globalCount += 1;
}
}
int main()
{
std::vector<std::thread> threads;
std::chrono::system_clock::time_point startTime = std::chrono::system_clock::now();
for (int i = 0; i < 10; ++i)
{
threads.push_back(std::thread(ThreadFunction));
}
for (int i=0;i<10;++i)
{
threads[i].join();
}
std::chrono::system_clock::time_point endTime = std::chrono::system_clock::now();
std::cout << "当前总数为:" << globalCount << std::endl;
std::cout << "消耗时间为:" << std::chrono::duration_cast<std::chrono::milliseconds> (endTime - startTime).count() <<"毫秒"<< std::endl;
getchar();
return 0;
}
3.2 使用互斥量保证线程互斥
#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include <vector>
#include <chrono>
long long globalCount = 0;
std::mutex globalMutex;
void ThreadFunction()
{
std::lock_guard<std::mutex> lock(globalMutex);
for (int i=0;i<100000;++i)
{
globalCount += 1;
}
}
int main()
{
std::vector<std::thread> threads;
std::chrono::system_clock::time_point startTime = std::chrono::system_clock::now();
for (int i = 0; i < 10; ++i)
{
threads.push_back(std::thread(ThreadFunction));
}
for (int i=0;i<10;++i)
{
threads[i].join();
}
std::chrono::system_clock::time_point endTime = std::chrono::system_clock::now();
std::cout << "当前总数为:" << globalCount << std::endl;
std::cout << "消耗时间为:" << std::chrono::duration_cast<std::chrono::milliseconds> (endTime - startTime).count() <<"毫秒"<< std::endl;
getchar();
return 0;
}
3.3 使用原子量std::atomic保证数据互斥
#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include <vector>
#include <chrono>
std::atomic<long> globalCount = 0;
void ThreadFunction()
{
for (int i=0;i<100000;++i)
{
globalCount += 1;
}
}
int main()
{
std::vector<std::thread> threads;
std::chrono::system_clock::time_point startTime = std::chrono::system_clock::now();
for (int i = 0; i < 10; ++i)
{
threads.push_back(std::thread(ThreadFunction));
}
for (int i=0;i<10;++i)
{
threads[i].join();
}
std::chrono::system_clock::time_point endTime = std::chrono::system_clock::now();
std::cout << "当前总数为:" << globalCount << std::endl;
std::cout << "消耗时间为:" << std::chrono::duration_cast<std::chrono::milliseconds> (endTime - startTime).count() <<"毫秒"<< std::endl;
getchar();
return 0;
}
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++11/std::atomic – 原子变量(不加锁实现线程互斥)
原文链接:https://www.stubbornhuang.com/781/
发布于:2020年04月02日 13:28:17
修改于:2023年06月26日 22:29:14
当前分类随机文章推荐
- C++ - windows、linux跨平台递归创建多级目录 阅读416次,点赞0次
- C++11 - 基于无锁队列的单生产者单消费者模型 阅读6695次,点赞1次
- C++ - const修饰符与指针 阅读593次,点赞1次
- C++ - 使用标准库std::use_facet和std::codecvt进行跨平台gbk与utf8字符集转换 阅读485次,点赞0次
- C++ - 将std::vector中的数值拷贝到数组中 阅读3589次,点赞1次
- C++ - 使用Spout2将视频流发送到OBS 阅读219次,点赞0次
- C++ - 使用宏区分不同系统平台、不同编译器、不同编译模式等编译期宏使用总结 阅读1801次,点赞0次
- C++ - 判断本机文件是否存在的方式总结 阅读6159次,点赞0次
- C++ - Windows系统获取桌面路径 阅读460次,点赞0次
- C++STL容器 - std::map查找元素与判断键值是否存在方法总结 count,find,contains,equal_range,lower_bound,upper_bound 阅读1257次,点赞0次
全站随机文章推荐
- 计算几何与计算机图形学必读书单整理 阅读23070次,点赞20次
- 资源分享 - Natural Language Processing in Action 英文高清PDF下载 阅读935次,点赞0次
- 资源分享 - Hands-On C++ Game Animation Programming 英文PDF下载 阅读1194次,点赞0次
- Python – 解决opencv-python使用cv2.imwrite()保存中文路径图片失败的问题 阅读2284次,点赞0次
- 网站推荐 - 注册chatGPT无法接收验证短信?使用便宜好用的sms-activate 阅读4844次,点赞2次
- 资源分享 - Game Programming Gems 1 英文高清PDF下载 阅读2595次,点赞0次
- OpenCV - 将图片/视频转换为深度学习模型输入格式,BGR通道转RGB,图片归一化,HWC转CHW 阅读5637次,点赞0次
- 资源分享 - Quaternions for Computer Graphics , First Edition 英文高清PDF下载 阅读2472次,点赞0次
- C++ - 线程安全的std::cout 阅读2285次,点赞0次
- Duilib - 使用Default设置控件默认的全局样式以及使用Style自定义样式 阅读255次,点赞0次
评论
169