Boost:共享锁:修订间差异
imported>Soleverlee 以“=示例代码= <source lang="cpp"> #include <iostream> #include <boost/thread.hpp> #include <windows.h> int sum = 0; boost::shared_mutex mu; int write(int c){ fo...”为内容创建页面 |
imported>Soleverlee |
||
(未显示同一用户的2个中间版本) | |||
第36行: | 第36行: | ||
=代码分析= | =代码分析= | ||
如果屏蔽掉上述代码两处加锁的地方,会出现什么情况? | 如果屏蔽掉上述代码两处加锁的地方,会出现什么情况? | ||
*第一次 | |||
[[Image:Test_Thread_ts1.png|600px]] | [[Image:Test_Thread_ts1.png|600px]] | ||
*第二次 | |||
[[Image:Test_Thread_ts2.png|600px]] | |||
可以看出,这两处地方读取到的数值是不对的,可能是在写的同时,正好读取到了脏数据。如果加上锁,结果才会如预期一样,是依次递增的。 | |||
[[Category:Programe]] | [[Category:Programe]] |
2015年10月30日 (五) 03:07的最新版本
示例代码
#include <iostream>
#include <boost/thread.hpp>
#include <windows.h>
int sum = 0;
boost::shared_mutex mu;
int write(int c){
for (int i = 0; i < c; i++){
boost::unique_lock<boost::shared_mutex> lock(mu);
sum++;
cout << "=>" << sum << endl;
}
return sum;
}
void read(int nCount){
for (int i = 0; i < nCount; i++){
boost::shared_lock<boost::shared_mutex> lock(mu);
cout << "<=" << sum << endl;
}
}
int main(int argc, char* argv[]) {
boost::thread t1(write, 100);
boost::thread t2(read, 100);
boost::thread t3(read, 100);
t1.join();
t2.join();
t3.join();
system("pause");
return 1;
}
代码分析
如果屏蔽掉上述代码两处加锁的地方,会出现什么情况?
- 第一次
- 第二次
可以看出,这两处地方读取到的数值是不对的,可能是在写的同时,正好读取到了脏数据。如果加上锁,结果才会如预期一样,是依次递增的。