2010-11-14 25 views
1

我有一个全局结构体,我在线程中使用,我使用pthread.h创建。 并发线程事件更新其中的变量。 因此,我通过广泛的调试发现,结构中的数据通常不同步。在线程中同步C中的结构体

C afaik中没有关键词“synchonized”(Java background)。那么,如何阻止数据结构以保持其有效性?

我的结构是:

struct thread_data 
{ 
    int nr; 
    int time; 
}; 
struct thread_data thread_data_array[MAX_THR]; 

MAX_THR被定义为10如

我的数据获取传递给新线程pthread_create

pthread_create(&threads[num_threads], NULL, Thread_Fkt, &thread_data_array[num_thread]); 

有时候线程是内其他创建线程。没有线性终端。 C是否提供了一组同步的数据结构?

感谢)

回答

8

你或许应该考虑并行线程mutex

一个互斥互斥设备, 并且是用于保护从并发 修改共享 数据结构,以及执行有用 关键部分和监视器。

+3

我也会使结构不透明,并将所有的访问/ mutate操作移动到函数中,所以你知道你在一个地方拥有了一切。 – 2010-11-14 18:09:53

4

线程不是C本身的一部分,而是操作系统的一部分。

pthread_create中的“pthread”代表POSIX线程。在POSIX中有几个实用程序可以在线程之间进行同步。这肯定取决于你想要达到的目标。

pthread_mutex_t 
pthread_barrier_t 
pthread_cond_t 

您可以咨询他们的“初始化”功能手册页找到这些第一信息,e.g

man pthread_mutex_init 
1

我只是想澄清这两个答案。

与其他语言不同,在“C”中,不能只声明一个结构为“protected”,并让编译器/库/框架为您抽象所有同步。

并行线程互斥的路要走,但它是一个手动过程中有确定的代码这部分(这不同于数据结构)将被保护,并将该保护置于您的代码中。

这包括确定哪些代码件会触及这些共享的数据结构,并把代码内部适当的pthread_mutex_lock和调用pthread_mutex_unlock语句。

+0

我想补充一点,“其他编译器/ lib/fw”肯定*不会*为您抽象“全部同步”,尤其是对于像Java或C#这样具有“同步”关键字的语言,您似乎暗示了这一点。内在线程安全&& || C中也存在无锁的数据结构,尽管它们当然不在标准库中,因此不可用于非启动的可悲数据结构。 – gimpf 2010-11-22 16:46:53

2

假设您的num_threads变量是全局变量并且在所有线程之间共享。

int num_threads = 0; 
pthread_mutex_t mtx_num_threads = PTHREAD_MUTEX_INITIALIZER; 

然后,每当你访问的变量,你需要采取互斥锁:

pthread_mutex_lock(&mtx_num_threads); 
new_thread = num_threads++; 
pthread_mutex_unlock(&mtx_num_threads); 

pthread_create(&threads[new_thread], NULL, Thread_Fkt, &thread_data_array[new_thread]); 
0

由于采用并行线程互斥体的一个例子,则可以通过将宣布相关联的互斥锁保护这个变量互斥体很慢。看看你是否可以逃脱原子操作。