整理自: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 }
View Code

相关文章:

  • 2021-09-09
  • 2021-10-18
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-06
猜你喜欢
  • 2021-12-03
  • 2022-12-23
  • 2022-12-23
  • 2022-02-11
  • 2021-11-11
相关资源
相似解决方案