在我的示例中,执行绪 1 和 2 写入相同的共享资源x
。并且主执行绪将读取该值。我想要结果,24
即thread2 然后thread1。
我怎么能控制它?我尝试在 1 之前定义执行绪 2 并join
在两个执行绪之后打印结果,24
但结果是,但由于执行绪并行作业,因此不能保证此结果
int x = 10;
void mainThread1(){
x *= 2;
}
void mainThread2(){
x = 2;
}
int main() {
std::thread th1(mainThread1);
std::thread th2(mainThread2);
std::cout << x << std::endl; // random print 20 or 22
th1.join();
th2.join();
}
uj5u.com热心网友回复:
大概您正在寻找的不是这里的琐碎答案:在开始第二个执行绪之前加入第一个执行绪。您正在展示一个简化的示例来说明更一般的情况。
这是对的。与多个执行绪之间的相对操作顺序相关的问题,以及当一个执行执行绪的效果在另一个执行执行绪中“可见”时,属于一个相当广泛、复杂和广泛的 C 域,称为“同步”。
执行绪间同步使用互斥体、条件变量和原子。就像所有其他大型 C 主题一样,在此处对 Stackoverflow 的简短回答中描述所有需要描述的关于同步的内容是不切实际的。那将需要页面。因此,我将仅提供这个简单用例如何处理同步的简要总结,并将所有进一步的血腥细节推荐给您最喜欢的 C 教科书或参考资料,以获取更多信息。但这里如何做到这一点的基本大纲是:
- 定义一个互斥,条件变量和
bool
标志,除x
。 - 第一个执行执行绪锁定互斥体,更新
x
,设定bool
标志,并通知条件变量,然后释放互斥体。 - 第二个执行执行绪锁定互斥锁,然后锁定
wait_for
条件变量,条件为flag == true
。 - 第二个执行执行绪更新
x
并释放互斥锁。
这是保证您正在寻找的两个执行执行绪之间的执行顺序的经典解决方案。以上回答如何保证结果
在显示的代码中生成。
uj5u.com热心网友回复:
您可以使用全域,condition_variable
以便:
- 第二个要执行的执行绪等待它。
- 首先要执行的执行绪完成它的作业并设定它。
请注意,由于虚假唤醒,执行绪可能会从条件变量的等待中唤醒,因此您应该提供额外的机制,例如布林值,以告知notify
实际发生的情况。
[演示]
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>
int x{10};
bool ready{false};
std::mutex m{};
std::condition_variable cv{};
void mainThread1() {
std::unique_lock<std::mutex> lk{m};
cv.wait(lk, []{ return ready; });
x *= 2;
}
void mainThread2() {
x = 2;
ready = true;
cv.notify_one();
}
int main() {
std::thread th1(mainThread1);
std::thread th2(mainThread2);
th1.join();
th2.join();
std::cout << x << "\n"; // prints 24
}
0 评论