C++11:并发、多线程
2016-01-25 10:25
183 查看
原子操作和原子类型
Linux下借助POSIX标准的pthread库的互斥锁:
上面代码为共享变量创建互斥锁(m),并在进入临界区前后进行加锁(pthread_mutex_lock)和解锁(pthread_mutex_unlock),从而保证累加的代码为原子操作。但这样对互斥锁的管理无疑是种负担,而在C++11中不需要如此麻烦:
原子数据类型在线程间被互斥地访问。相比pthread的实现,同步的是数据而不是代码,遵从了面向对象的思想。
除了使用上图中的已经定义好的原子类型,我们还可以使用atomic类模板,通过
原子操作和原子类型
通常情况下,原子操作是通过互斥(mutual exclusive)的访问来保证的。Linux下借助POSIX标准的pthread库的互斥锁:
#include <iostream> #include <pthread.h> using namespace std; static long long total = 0; pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; void* func(void *) { for (long long i = 0; i < 100000000LL; ++i) { pthread_mutex_lock(&m); total += i; pthread_mutex_unlock(&m); } } int main() { pthread_t t1; pthread_t t2; if (pthread_create(&t1, NULL, &func, NULL)) { throw; } if (pthread_create(&t2, NULL, &func, NULL)) { throw; } pthread_join(t1, NULL); pthread_join(t2, NULL); cout << total << endl; // 9999999900000000 return 0; }
上面代码为共享变量创建互斥锁(m),并在进入临界区前后进行加锁(pthread_mutex_lock)和解锁(pthread_mutex_unlock),从而保证累加的代码为原子操作。但这样对互斥锁的管理无疑是种负担,而在C++11中不需要如此麻烦:
#include <iostream> #include <atomic> #include <thread> using namespace std; atomic_llong total {0}; // 原子数据类型 void func(int x) { cout << x << endl; for (long long i = 0; i < 100000000LL; ++i) { total += i; } } int main() { thread t1(func, 0); thread t2(func, 3); t1.join(); t2.join(); cout << total << endl; // 9999999900000000 return 0; }
原子数据类型在线程间被互斥地访问。相比pthread的实现,同步的是数据而不是代码,遵从了面向对象的思想。
除了使用上图中的已经定义好的原子类型,我们还可以使用atomic类模板,通过
std::atomic<T> t;能定义出任意的原子类型。编译器会保证产生并发情况下行为良好的代码,以避免线程间对数据t的竞争。
相关文章推荐
- [c++]继承覆盖与函数重载
- MFC Split(字符串截取)函数的实现
- C++的引用
- C语言循环数组做FIFO队列--一些认识
- C语言获取Windows总CPU使用率.
- 局部敏感哈希(原始LSH)C++实现
- VC++获取当前系统时间日期 GetSystemTime()函数的用法
- JetBrains C++ IDE 推荐
- 2012年第三届蓝桥杯C/C++程序设计本科B组省赛 密码发生器(编程大题)
- 2012年第三届蓝桥杯C/C++程序设计本科B组省赛 放棋子(代码填空)
- CTCI系列--1.5 字符串压缩(C语言)
- 2012年第三届蓝桥杯C/C++程序设计本科B组省赛 大数乘法(代码填空)
- CTCI系列--1.4 字符替换(C语言)
- 2012年第三届蓝桥杯C/C++程序设计本科B组省赛 方阵旋转(代码填空)
- C++ 匿名namespace的作用以及它与static的区别
- 2012年第三届蓝桥杯C/C++程序设计本科B组省赛 海盗比酒量(结果填空)
- 2012年第三届蓝桥杯C/C++程序设计本科B组省赛 古堡算式(结果填空)
- C++调用C函数
- 2012年第三届蓝桥杯C/C++程序设计本科B组省赛 微生物增殖(结果填空)
- C语言里为何会有“2+2=5”的结果