【发布时间】:2023-03-27 03:59:01
【问题描述】:
考虑这个简单的并发示例:
#include <iostream> // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex
std::mutex mtx; // mutex for critical section
void print_block(int n, char c) {
// critical section (exclusive access to std::cout signaled by locking mtx):
mtx.lock();
for (int i = 0; i<n; ++i) { std::cout << c; }
std::cout << '\n';
mtx.unlock();
}
int main()
{
std::thread th1(print_block, 50, '*');
std::thread th2(print_block, 50, '$');
th1.join();
th2.join();
return 0;
}
是否总是保证th1 将是第一个执行 for 循环的线程?
意思是,当我这样做时:
th1.join();
th2.join();
那我可以绝对确定th1 会先执行然后th2 吗?
【问题讨论】:
-
在处理并发编程时,永远不要对执行顺序做出任何假设。相反,假设所有情况都是可能的。这使您的代码更可靠,但矛盾的是,更简单。
-
You are using
std::mutexwrong, , 你永远不应该打电话给std::mutex::lock()和std::mutex::unlock()。而是在print_block()的开头创建一个std::lock_guard<std::mutex>并让它为您锁定和解锁互斥锁。 -
通常情况下,我们不关心谁先走,我们关心谁先完成,这就是为什么我们有函数
join。在您的示例中,th1将首先出现,因为您在main中将th1放在th2之前。 -
使用条件变量或许能达到你想要的效果,但又有什么意义呢?
标签: c++ multithreading visual-studio visual-studio-2012