我知道这个问题看起来与现有问题类似,但我找不到有用的建议。 我正在编写一个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循环中放置互斥锁。 谢谢你的任何建议。
答案 0 :(得分:0)
在发送线程中,循环
while(!executed);
由编译器优化为
some_register = !executed;
while(some_register);
因为据它所知,executed
的值在循环条件的测试之间不能改变(毕竟循环体是空的)。
通常建议的解决方法是通过使用互斥锁保护对此变量的每次读/写,如下所示:
temp = true;
while(temp){
mutex_lock(m);
temp = !executed;
mutex_unlock(m);
}
对于这种情况,甚至更好,一个条件变量。这些结构导致“内存障碍”,这简单地表示在访问互斥锁之前加载到寄存器中的变量将被假定为陈旧并在使用后重新加载。
在某些情况下经常被滥用但可能是正确方法的另一种方法是将executed
声明为volatile
。这会导致只有这个变量的每个读取/仪式一直到内存而不是使用缓存的寄存器。
答案 1 :(得分:0)
我非常想把条件var(或事件/信号量同步对象)放在消息本身中。生产者发送消息并等待同步,消费者处理它并发出同步信号。
这更灵活,(多个制作人可以轻松安全地使用'消费者,假设您的消息队列/任何多生产者安全),并摆脱讨厌的全局。
'而(执行!);'民意调查很糟糕。浪费CPU周期和内存带宽。超级跛脚:( Stil,试图真正回答这个问题,即使它是一个非常糟糕的设计 - 使用原子int / bool。看看你的操作系统找出使用的指令 - C本身就是没有帮助:(