【发布时间】:2020-09-23 20:25:29
【问题描述】:
简单示例:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex lock_m;
void childTh() {
while(true) {
//std::this_thread::yield();
//std::this_thread::sleep_for(std::chrono::milliseconds(1));
std::unique_lock<std::mutex> lockChild(lock_m);
std::cout << "childTh CPN1" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
}
int main(int, char**) {
std::thread thr(childTh);
std::this_thread::sleep_for(std::chrono::milliseconds(200));
std::unique_lock<std::mutex> lockMain(lock_m);
std::cout << "MainTh CPN1" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(10));
return 0;
}
lockMain 上的主线程阻塞并且永远不会到达“MainTh CPN1”。我希望当 childTh 到达迭代结束时主线程应该获取 lock_m,因为 lockChild 被破坏并且 lock_m 被释放。但这永远不会发生。 您能否详细描述一下为什么主线程在 childTh 再次锁定之前没有时间获取锁? 使用 sleep_for main 可以达到“MainTh CPN1”,但使用 yield 不能。 我知道 condition_variable 可以用来通知和解除阻塞另一个线程,但是可以只使用作用域锁吗?所以看起来在不同的线程中使用作用域锁是有风险的,即使是同一个锁。
【问题讨论】:
标签: c++ multithreading