在C中同步struct以进行线程化

时间:2010-11-14 17:56:24

标签: c linux multithreading posix

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

在C afaik中没有像“synchonized”(Java背景)这样的关键字。那么如何阻止数据结构以使其有效?

我的结构是:

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是否提供了一组同步的数据结构?

谢谢;)

5 个答案:

答案 0 :(得分:8)

您应该查看pthread mutex

  

互斥是MUTual排除设备,   并有助于保护共享   来自并发的数据结构   修改和实施   关键部分和监督。

答案 1 :(得分:4)

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

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

pthread_mutex_t
pthread_barrier_t
pthread_cond_t

您可以通过查阅其“init”功能的手册页来找到有关这些信息的第一个信息,例如

man pthread_mutex_init

答案 2 :(得分:2)

据推测,您的num_threads变量是全局的,并且在所有线程之间共享。作为使用pthreads互斥锁的示例,您可以通过声明关联的互斥锁来保护此变量:

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]);

答案 3 :(得分:1)

我只是想澄清其他两个答案。

与其他语言不同,在“C”中,您不能将结构声明为“受保护”,并且让编译器/库/框架为您提供所有同步。

pthread互斥 是的方法,但这是一个手动过程,其中必须确定哪些部分代码(而不是数据结构)将受到保护,并将该保护放在您的代码中。

这包括确定哪些代码将触及这些共享数据结构,并将代码放在中适当的pthread_mutex_lock和pthread_mutex_unlock语句。

答案 4 :(得分:0)

互斥体很慢。看看你是否可以逃脱原子操作。