没有IPC的线程之间进行通信

时间:2013-12-23 16:49:17

标签: c linux multithreading

考虑我有两个线程:THREAD 1和THREAD 2。 我只是想在他们之间进行沟通。 THREAD 1包含一个存储在指针中的值,THREAD 2需要在该线程周围访问指针值。

根据我的理解,我认为我们可以直接取消引用从一个线程到另一个线程的指针。但我朋友的建议是我只通过IPC机制访问该值,而不是我的建议。

请对此发表评论。 什么是最好的方法和原因......?

2 个答案:

答案 0 :(得分:9)

两个线程可以访问同一个变量,没关系。请注意synchronization issues。如果两个线程都写入该值,则可能存在race condition。如果任一线程写入值non-atomically(使得数据的值始终不处于一致状态),则其他线程可能在其处于无效中间状态时读取该值。需要使用mutexessemaphores

等同步原语来处理这些情况

答案 1 :(得分:3)

阅读一篇好文章posix threads tutorial。您将理解为什么在实践中使用同步原语这么重要(至少从您的程序中获得可理解的行为)。

任何数据都可以在线程之间共享,因为它们共享相同的公共address space。但是,您确实想要同步这样的共享访问(因为当一个线程看到另一个线程完成的更改时,您无法知道,没有显式同步;请阅读cache coherence)。一种常见的方法是使用mutexes

要解释一下,请使用共享的全局数据声明一个全局互斥:

pthread_mutex_t glob_mtx = PTHREAD_MUTEX_INITIALIZER;
static struct globaldata_st glob_data;

然后,要访问某些数据,请执行此操作。

int sharednumber;
pthread_mutex_lock(&glob_mtx);
sharednumber = glob_data.number;
pthread_mutex_unlock(&glob_mtx);

原子通过递增来更新该数据:

int sharednumber;
pthread_mutex_lock(&glob_mtx);
sharednumber = glob_data.number++;
pthread_mutex_unlock(&glob_mtx);

你会同样序列化更新或访问共享链表等等....

不要害羞使用互斥锁,它们是quite fast。始终将pthread_mutex_lockpthread_mutex_unlock ....

配对

请记住同步错误非常难以搜寻,因为它们不可重现:它们是heisenbugs

在Linux / x86-64上使用GCC 4.8,您可以使用线程清理程序gcc -Wall -fsanitize=thread -g来简化调试。