我有一个线程,它在程序启动时被启动并持续运行(我使用pthreads)。我需要从主线程发送命令到线程。我可以设置一个全局变量,但这似乎有风险,因为如果次要线程和主线程试图同时访问它怎么办?我可以把变量包装在互斥锁中,但有必要吗?如果我在主线程中放入一个按钮,执行如下代码:
// main thread
if(!trigger_variable)
trigger_variable=1;
然后,在第二个线程中,我使用这个:
// other thread
if(trigger_variable){
do_something();
trigger_variable=0;
}
是否足够健壮以避免使用互斥锁?
只要是原子类型,trigger_variable
就可以工作;对于常规/非原子类型,它将调用未定义的行为,因为您将有两个线程在没有任何同步的情况下读写相同的内存。
然而,设置共享变量并不完全是"发送命令"。设置了一块共享状态,所以我不会称之为"防弹"为此目的。例如,如果您想快速连续地发送两个命令,那么很难保证两个命令都被接收到,因为对变量的第二次更改可能会在子线程有机会看到第一个值之前覆盖第一个值。
如果你希望能够正确地发送命令(例如,每个命令都被子线程接收,按照命令发送的顺序),一个相对简单的方法是让主线程创建一个管道,并将管道的数据读取文件描述符提供给子线程。然后主线程可以在它想要子线程做某事的时候在data- write_file -descriptor上写()一个字节,子线程可以读()这个字节并做出相应的反应。
根据ISO C11官方标准§5.1.2.4¶25和¶4,两个不同的线程以无序的方式使用非原子操作读写相同的内存位置会导致未定义的行为。
但是,如果您使用原子类型或原子操作库,那么您的计划应该可以工作。