免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/u014746838/article/details/90473600
複数のスレッドが同じリソースにアクセスすると、データの一貫性を確保するために、最も簡単な方法は、ミューテックス(ミューテックス)を使用することです。
(1)直接ミューテックス操作、すなわち直接ミューテックスのロック/アンロック機能を呼び出します。尚、この例では、スレッドのセットを作成するために、ブースト:: thread_groupを使用しています。
#include <iostream>
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
boost::mutex mutex;
int count = 0;
void Counter() {
mutex.lock();
int i = ++count;
std::cout << "count == " << i << std::endl;
// 前面代码如有异常,unlock 就调不到了。
mutex.unlock();
}
int main() {
// 创建一组线程。
boost::thread_group threads;
for (int i = 0; i < 4; ++i) {
threads.create_thread(&Counter);
}
// 等待所有线程结束。
threads.join_all();
return 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;
void Counter() {
// lock_guard 在构造函数里加锁,在析构函数里解锁。
boost::lock_guard<boost::mutex> lock(mutex);
int i = ++count;
std::cout << "count == " << i << std::endl;
}
int main() {
boost::thread_group threads;
for (int i = 0; i < 4; ++i) {
threads.create_thread(&Counter);
}
threads.join_all();
return 0;
}
(3)ロック解除、自動ロックをunique_lockの使用。
unique_lockのと同じ原理をlock_guardが、より多くの機能(例えば、可変条件の使用などを組み合わせることができる)を有します。注意:typedefでの実際のunique_lockの中のmutex :: scoped_lock <mutexを>。
#include <iostream>
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
boost::mutex mutex;
int count = 0;
void Counter() {
boost::unique_lock<boost::mutex> lock(mutex);
int i = ++count;
std::cout << "count == " << i << std::endl;
}
int main() {
boost::thread_group threads;
for (int i = 0; i < 4; ++i) {
threads.create_thread(&Counter);
}
threads.join_all();
return 0;
}