【问题标题】:pthread synchronization using mutex使用互斥锁的 pthread 同步
【发布时间】:2017-04-22 01:09:51
【问题描述】:

我试图创建 2 个线程并调用相同的函数,该函数从 for 循环中增加一个计数器“计数”。但是每次我运行这段代码时,计数器的值都是不同的。当线程增加全局静态变量“count”但值仍然不同时,我尝试使用互斥锁在线程之间进行同步。

static int  count;
pthread_mutex_t count_mutex;

 void increment()
 {
    pthread_mutex_lock(&count_mutex);
    count++;
    pthread_mutex_unlock(&count_mutex);
}

void *myThreadFun1(void *var)
{
    printf("Thread1\n");
    for(int i=0; i< 10000;i++)
    {
        increment();
    }
    return;
}

int main()
{
    pthread_t tid1;
    pthread_t tid2;
    pthread_create(&tid1, NULL, myThreadFun1, NULL);
    // sleep(1);
    pthread_create(&tid2, NULL, myThreadFun1, NULL);
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);

    printf("\n%d",count);
    exit(0);
}

如果我不在线程之间休眠,输出永远不会是 20000。

在java中我们可以使用“synchronized”关键字,但是如何在C中实现呢?

【问题讨论】:

  • pthread_mutex_t 使用前需要初始化。
  • 是的,我将它初始化为 PTHREAD_MUTEX_INITIALIZER,现在输出是我所期望的。谢谢。
  • @gaurav 更新代码的工作版本。
  • @gaurav:标准要求在使用前对互斥锁进行 init,但是对于文件静态或全局,默认的 0 init 恰好可以工作(当然不建议依赖这个)。出于好奇,您使用的是什么操作系统/CPU?
  • @ErikAlapää 是的,我错过了初始化互斥锁。我在 macOS 上。

标签: c multithreading pthreads mutex thread-synchronization


【解决方案1】:

pthread_mutex_t 需要在使用前进行初始化。它必须开始解锁且未绑定。有一个调用 pthread_mutex_init(&theMutex) 可以做到这一点,或者可以为静态初始化分配一个预定义的值:PTHREAD_MUTEX_INITIALIZER

【讨论】:

    猜你喜欢
    • 2012-08-28
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多