gpt4 book ai didi

c - 使用 bool 全局变量进行线程同步

转载 作者:太空宇宙 更新时间:2023-11-04 04:32:01 24 4
gpt4 key购买 nike

我知道这个问题看起来与现有问题相似,但我找不到有用的建议。我正在编写一个 C 程序,其中包括两个线程,一个发送消息,另一个检查消息的回复。我希望发送消息的线程停止,直到接收线程变为 true 一个 bool 变量,表明发送消息中包含的请求已得到满足。我写了一个这种类型的代码。对于发送线程:

  executed = false;
function_to_send_the_message();
while(!executed);

对于接收线程:

msg = function_to_receive_the_message();

if(msg->good){
status = pthread_mutex_lock(&mutex);
assert(status == 0);
executed = true;
printf("Executed order!\n");
pthread_mutex_unlock(&mutex);
assert(status == 0);
}

互斥量是一个全局变量。这是一个简化的代码,所以不要看一些奇怪的语句。关键是发送线程在 while 循环中被阻塞,不会继续。我不知道是否以及如何在 while 循环中也放置一个互斥量。感谢您的任何建议。

最佳答案

在你的发送线程中,循环

while(!executed);

被编译器优化成类似的东西

some_register = !executed;
while(some_register);

因为据它所知,executed 的值不能在循环条件测试之间改变(毕竟循环体是空的)。

解决此问题的通常建议方法是使用互斥锁来保护对该变量的每次读/写,如下所示:

temp = true;
while(temp){
mutex_lock(m);
temp = !executed;
mutex_unlock(m);
}

对于这种情况甚至更好,条件变量。这些构造会导致“内存障碍”,简单地说,这意味着在访问互斥锁之前加载到寄存器中的变量将被假定为陈旧的,并在使用它之后重新加载。

另一种经常被误用但在某些情况下可能是正确方法的方法是将 executed 声明为 volatile。这导致每次读/写只有这个变量一直到内存,而不是使用缓存寄存器。

关于c - 使用 bool 全局变量进行线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35070114/

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