当多个线程访问同一资源时,最简单的方法是使用独占锁(mutex )来确保数据完整性。
(1) .直接操作mutex,即直接调用mutex的lock/unlock函数。 本示例使用boost:thread_group创建线程组。
#include iostream
#include boost/thread/mutex.hpp
# include boost/thread/thread.HPP
boost:mutex mutex;
int count=0;
语音计数器
mutex.lock (;
int i= count;
STD :3360 cout ' count==' istd 33603360 endl;
//如果前面的代码有异常,unlock将无法调整。
mutex.unlock (;
}
int main () )。
//创建线程组。
boost :3360 thread _ group threads;
for(intI=0; i 4; I ) {
threads.create_thread(counter );
}
//等待所有线程结束。
threads.join_all (;
返回0;
(2) .使用lock_guard自动锁定、解锁。 原理是RAII,与智能指针相似
#include iostream
# include boost/thread/lock _ guard.HPP
#include boost/thread/mutex.hpp
# include boost/thread/thread.HPP
boost:mutex mutex;
int count=0;
语音计数器
//lock_guard用构造函数锁定,用析构函数解除锁定。
boost :3360 lock _ guard boost :3360 mutex lock (mutex );
int i= count;
STD :3360 cout ' count==' istd 33603360 endl;
}
int main () )。
boost :3360 thread _ group threads;
for(intI=0; i 4; I ) {
threads.create_thread(counter );
}
threads.join_all (;
返回0;
(3) .通过unique_lock自动锁定、解锁。
unique_lock与lock_guard的原理相同,但提供了更多功能,如可与条件变量结合使用。 注意: mutex:scoped_lock实际上是unique_lockmutex的类型def。
#include iostream
#include boost/thread/mutex.hpp
# include boost/thread/thread.HPP
boost:mutex mutex;
int count=0;
语音计数器
boost :3360 unique _ lock boost :3360 mutex lock (mutex );
int i= count;
STD :3360 cout ' count==' istd 33603360 endl;
}
int main () )。
boost :3360 thread _ group threads;
for(intI=0; i 4; I ) {
threads.create_thread(counter );
}
threads.join_all (;
返回0;
最后,如果你想学习C/C,请通过私信小编“01”取得素材资料、开发工具和听课权限。