考虑到我有两个线程:线程1和线程2.我只是想在它们之间进行通信。 THREAD 1包含存储在指针中的值,THREAD 2需要在该线程周围访问指针值。
根据我的理解,我认为我们可以直接从一个线程去引用一个指针。 但是我朋友的build议是我只通过IPC机制来获取价值,而不是我的build议。
请对此评论。 什么是最好的办法,为什么…?
两个线程可以访问相同的变量,这很好。 只要小心同步问题 。 如果两个线程都写入该值,则存在竞争条件的可能性。 如果任一线程以非原子方式写入值(使得数据的值始终不是一致的状态),则其他线程可能会在无效中间状态下读取该值。 这些情况需要用像互斥 , 信号等同步原语来处理。
阅读一个好的posix线程教程 。 您将理解为什么在实践中使用同步原语(至少从程序中获得可理解的行为)是如此重要。
任何数据都可以在线程之间共享,因为它们都共享相同的公共地址空间 。 然而,你真的想同步这样的共享访问(因为你不知道,没有明确的同步,当一个线程看到另一个线程完成的变化,读取缓存一致性 )。 一个常见的方法是使用互斥体 。
要解释一下,用共享的全局数据声明一个全局互斥体:
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);
你会类似序列化更新或访问共享链表队列等….
不要害怕使用互斥体,它们相当快 。 始终将pthread_mutex_lock
与pthread_mutex_unlock
配对….
请记住, 同步错误非常难以搜索,因为它们不可重现:它们是heisenbugs 。
使用Linux / x86-64上的GCC 4.8 ,可以使用gcc -Wall -fsanitize=thread -g
来gcc -Wall -fsanitize=thread -g
,以便于调试。