整理自:zh.cppreference.com/w/cpp/thread
互斥锁
互斥算法避免多个线程同时访问共享资源。这会避免数据竞争,并提供线程间的同步支持。定义于头文件 <mutex>
互斥锁有可重入、不可重入之分。C++标准库中用 mutex 表示不可重入的互斥锁,用 recursive_mutex 表示可重入的互斥锁。为这两个类增加根据时间来阻塞线程的能力,就又有了两个新的互斥锁:timed_mutex(不可重入的锁)、recursive_timed_mutex(可重入的锁)
C++标准库的所有mutex都是不可拷贝的,也不可移动
std::mutex:
mutex 类是能用于保护共享数据免受从多个线程同时访问的同步原语。mutex 提供排他性非递归所有权语义。操作:
lock:如果 mutex 未上锁,则将其上锁。否则如果已经其它线程 lock,则阻塞当前线程
try_lock:如果 mutex 未上锁,则将其上锁。否则返回 false,并不阻塞当前线程
unlock:如果 mutex 被当前线程锁住,则将其解锁。否则,是未定义的行为
native_handle:返回底层实现定义的线程句柄
注意:std::mutex 既不可复制亦不可移动
例1:
1 #include <iostream> 2 #include <chrono> 3 #include <thread> 4 #include <mutex> 5 using namespace std; 6 7 int g_num = 0;//为 g_num_mutex 所保护 8 std::mutex g_num_mutex; 9 10 void slow_increment(int id) { 11 for(int i = 0; i < 3; ++i) { 12 g_num_mutex.lock(); 13 ++g_num; 14 cout << id << " => " << g_num << endl; 15 g_num_mutex.unlock(); 16 17 std::this_thread::sleep_for(std::chrono::seconds(1)); 18 } 19 } 20 21 int main(void) { 22 std::thread t1(slow_increment, 0); 23 std::thread t2(slow_increment, 1); 24 t1.join(); 25 t2.join(); 26 27 // 输出: 28 // 0 => 1 29 // 1 => 2 30 // 0 => 3 31 // 1 => 4 32 // 0 => 5 33 // 1 => 6 34 35 return 0; 36 }