gpt4 book ai didi

c++ - std::mutex 线程间同步

转载 作者:行者123 更新时间:2023-11-28 05:18:35 25 4
gpt4 key购买 nike

我有这个示例代码:

//#include "stdafx.h"    
#include <iostream>
#include <chrono>
#include <thread>
#include <mutex>


int g_num = 0; // protected by g_num_mutex
std::mutex g_num_mutex;

void slow_increment(int id)
{
std::cout << id << " STARTED\n";
for (int i = 0; i < 100; ++i) {
g_num_mutex.lock(); //STARTLOOP
++g_num;
std::cout << id << " => " << g_num << '\n';
std::this_thread::sleep_for(std::chrono::seconds(1));
g_num_mutex.unlock();//ENDLOOP
// std::this_thread::sleep_for(std::chrono::milliseconds(1));//UNCOMMENT THIS LINE TO GET A CORRECT WORKING
}
}

int main()
{
std::thread t1(slow_increment, 0);
std::this_thread::sleep_for(std::chrono::seconds(6));
std::thread t2(slow_increment, 1);
t1.join();
t2.join();
return 0;
}

输出:

 0 STARTED
0 => 1
0 => 2
0 => 3
0 => 4
0 => 5
0 => 6
1 STARTED // mutex.lock() is done?
0 => 7
0 => 8
0 => 9
0 => 10
1 => 11 //aleatory number

如果我取消对 1ms sleep 的注释,我将正常工作:

0 STARTED
0 => 1
0 => 2
0 => 3
0 => 4
0 => 5
0 => 6
1 STARTED
1 => 7
0 => 8
1 => 9
0 => 10
1 => 11

当线程 1 在 mutex.lock() 中被阻塞时,我不明白线程 0 如何可以 lock() & unlock() 互斥...

使用 std::this_thread::yield() 我看不出有什么区别(在 win32 中)但是 std::this_thread::sleep_for(std::chrono::milliseconds(1)) 似乎工作...

使用 C++14/17 std::shared_timed_mutexstd::shared_mutex,以及 lock_shared()/unlock_shared () 我得到了预期的结果...

有什么建议/解释吗?

最佳答案

你在 sleep 时持有互斥锁;互斥量一次解锁纳秒。如果系统没有在那几纳秒内检查线程 2(为什么会这样?),那么您将得到观察到的结果。

C++ 互斥锁是不公平的。如果您尝试锁定它,您将不会仅仅因为您是最后一个锁定它的线程而被拒绝。

关于c++ - std::mutex 线程间同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42023447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com