Boost:互斥锁:修订间差异
imported>Soleverlee 以“<source lang="cpp"> #include <iostream> #include <vector> #include <boost/thread.hpp> #include <windows.h> int sum = 0; boost::mutex mu; int addNum(int nCount){ fo...”为内容创建页面 |
imported>Soleverlee 无编辑摘要 |
||
第1行: | 第1行: | ||
=示例代码= | |||
<source lang="cpp"> | <source lang="cpp"> | ||
#include <iostream> | #include <iostream> | ||
第37行: | 第38行: | ||
} | } | ||
</source> | </source> | ||
=代码分析= | |||
如上的这一段代码,创建了1000个线程,每个线程把sum增加1000,那么程序的结果理论上应该是: | 如上的这一段代码,创建了1000个线程,每个线程把sum增加1000,那么程序的结果理论上应该是: | ||
<pre> | <pre> | ||
第42行: | 第44行: | ||
</pre> | </pre> | ||
如果不加锁,我们屏蔽掉boost::mutex::scoped_lock lock(mu); 这一行代码,运行一下看看: | 如果不加锁,我们屏蔽掉boost::mutex::scoped_lock lock(mu); 这一行代码,运行一下看看: | ||
==第一次== | |||
[[Image::Test_Thread_t1.png|600px]] | |||
==第二次== | |||
[[Image::Test_Thread_t2.png|600px]] | |||
==第三次== | |||
[[Image::Test_Thread_t3.png|600px]] | |||
==第四次== | |||
[[Image::Test_Thread_t4.png|600px]] | |||
[[Category:Programe]] | [[Category:Programe]] |
2015年10月30日 (五) 02:46的版本
示例代码
#include <iostream>
#include <vector>
#include <boost/thread.hpp>
#include <windows.h>
int sum = 0;
boost::mutex mu;
int addNum(int nCount){
for (int i = 0; i < nCount; i++){
boost::mutex::scoped_lock lock(mu);
sum++;
}
return sum;
}
int main(int argc, char* argv[]) {
std::vector<boost::thread*> threads;
for (int i = 0; i < 1000; i++) {
boost::thread* t = new boost::thread(addNum, 1000);
threads.push_back(t);
}
std::vector<boost::thread*>::iterator it;
for (it = threads.begin(); it != threads.end(); it++) {
boost::thread* t = *it;
t->join();
}
for (int j = 0; j < 10; j++) {
std::cout << sum << endl;
Sleep(200);
}
for (it = threads.begin(); it != threads.end(); it++) {
boost::thread* t = *it;
delete t;
}
system("pause");
return 1;
}
代码分析
如上的这一段代码,创建了1000个线程,每个线程把sum增加1000,那么程序的结果理论上应该是:
1000 * 1000 = 1000,000
如果不加锁,我们屏蔽掉boost::mutex::scoped_lock lock(mu); 这一行代码,运行一下看看:
第一次
[[Image::Test_Thread_t1.png|600px]]
第二次
[[Image::Test_Thread_t2.png|600px]]
第三次
[[Image::Test_Thread_t3.png|600px]]
第四次
[[Image::Test_Thread_t4.png|600px]]