【问题标题】:C: thread_mutex SyncC: thread_mutex 同步
【发布时间】:2012-06-29 01:26:10
【问题描述】:

我遇到了多线程同步的问题,我将只发布一个我正在做的“尝试”同步的示例,因为原始代码更大。 基本上我有一个附加了 3 个线程的繁重进程,为了锁定/解锁我使用修改每个线程中互斥状态的函数的线程。像这样的:

## thread.c ##
    #include "thread.h"

extern int socks;

pthread_mutex_t sem = PTHREAD_MUTEX_INITIALIZER;

void lock()
{
    pthread_mutex_lock(&sem);
}

void unlock()
{
    pthread_mutex_unlock(&sem);
}

void* thread(void* arg)
{
    printf("Socks: %d\n",socks);
    lock();
    lock();

    printf("Unlocked\n");
    return;
}


## main.c ##
#include "defines.h"
#include "thread.h"

int socks;

int main()
{
    pthread_t tid;
    socks= 9;

    pthread_create(&tid, NULL, thread, NULL);

    //sleep(2);
    unlock();
    pthread_join(tid,NULL);
}

执行代码后得到的是:

./测试

袜子:9

显然我有一些概念错误,但我找不到问题。线程不应该用 unlock() 解锁?为什么我在解锁调用之前使用 sleep(2) 时程序可以工作? 我应该使用哪种方式来避免问题?每个代码都在单独的文件中。

提前致谢! PS:对不起我蹩脚的英语!

【问题讨论】:

  • 我看到两个lock() 命令,似乎都没有保护socks 变量。
  • 为什么会有两个连续的lock调用?似乎您的一个线程将在第二个lock 上阻塞,而所有其他线程将在第一个lock 上阻塞。
  • 那是因为互斥体开始打开了。所以我认为需要两个锁来阻塞线程。
  • int变量不会被修改,线程创建是在assign之后。有必要对那个变量进行互斥吗?

标签: c pthreads thread-synchronization


【解决方案1】:

由于线程是异步运行的,可能会发生主线程在线程锁定之前加入的情况。在这种情况下,我会怀疑 unlock() 发生得太早了,你得到的行为没有很好的定义。如果在解锁之前让主线程休眠一段时间,其他线程似乎有时间撞到锁并可以解锁,从而导致您似乎期望的行为。

【讨论】:

  • 我明白了。但是即使在锁定之前也不应该通过 unlock() 来增加互斥锁状态?在这种情况下,锁不会阻塞线程。
  • 互斥锁最初是解锁的。 pthread_mutex_unlock() 的规范说:“如果互斥锁未被调用线程锁定,则尝试解锁它会导致未定义的行为。”所以 unlock() 可能只是没有效果。
  • 谢谢你!这就是问题所在,我用 POSIX 信号量替换了 pthread_mutex,现在它可以完美运行了。
猜你喜欢
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多