我有一个在线程中使用的全局结构,我使用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是否提供了一组同步的数据结构?
谢谢;)
答案 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)
互斥体很慢。看看你是否可以逃脱原子操作。