【问题标题】:Synchronize struct in C for Threading在 C 中同步结构以进行线程处理
【发布时间】:2010-11-14 17:56:24
【问题描述】:

我有一个在线程中使用的全局结构,我使用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 是否提供了一组同步的数据结构?

谢谢 ;)

【问题讨论】:

    标签: c linux multithreading posix


    【解决方案1】:

    您可能应该查看 pthread mutex

    互斥锁是一种互斥设备, 并且对于保护共享有用 并发数据结构 修改和实施 关键部分和监视器。

    【讨论】:

    • 我还将使结构不透明并将所有访问/变异操作移动到函数中,这样您就知道您将所有东西都放在一个地方。
    【解决方案2】:

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

    pthread_create 中的“pthread”代表 POSIX 线程。 POSIX 中有几个实用程序可以在线程之间进行同步。这当然取决于您想要实现的具体目标。

    pthread_mutex_t
    pthread_barrier_t
    pthread_cond_t
    

    您可以通过查阅其“init”函数的手册页来找到有关这些的初步信息,例如

    man pthread_mutex_init
    

    【讨论】:

      【解决方案3】:

      大概你的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]);
      

      【讨论】:

        【解决方案4】:

        我只是想澄清另外两个答案。

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

        pthread 互斥锁要走的路,但它是一个手动过程,必须确定哪些部分代码(相对于哪些数据结构)将受到保护,并将该保护放入您的代码中。

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

        【讨论】:

        • 我想补充一点,“其他编译器/lib/fw”绝对为您抽象“所有同步”,尤其是对于具有“同步”关键字的语言正如您似乎暗示的那样,就像Java或C#一样。固有的线程安全 &&|| C 中也存在无锁数据结构,尽管它们当然不在标准库中,因此遗憾的是,对于未启动的人来说,它们无法访问。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-10-24
          • 1970-01-01
          • 1970-01-01
          • 2019-09-28
          • 2013-04-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多