Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:线程与互斥同步_C_Pthreads_Thread Synchronization - Fatal编程技术网

C:线程与互斥同步

C:线程与互斥同步,c,pthreads,thread-synchronization,C,Pthreads,Thread Synchronization,我有一个多线程同步的问题,我将只张贴一个例子,我正在做什么尝试同步,因为原始代码更大。 基本上,我有一个连接了3个线程的繁重进程,为了锁定/解锁线程,我使用修改每个线程中互斥状态的函数。大概是这样的: ## thread.c ## #include "thread.h" extern int socks; pthread_mutex_t sem = PTHREAD_MUTEX_INITIALIZER; void lock() { pthread_mute

我有一个多线程同步的问题,我将只张贴一个例子,我正在做什么尝试同步,因为原始代码更大。 基本上,我有一个连接了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解锁?为什么在解锁呼叫之前我使用sleep2时程序会工作? 我应该用哪种方法来避免问题?每个代码都在单独的文件中

提前谢谢!
PS:对不起,我的英语糟透了

由于线程是异步运行的,因此主线程可能会在线程到达锁之前加入。在这种情况下,我会怀疑解锁发生得太早,并且您得到的行为没有得到很好的定义。如果在解锁前让主线程休眠一段时间,则另一个线程似乎有时间锁定并可以解锁,从而导致您预期的行为。

我看到两个锁定命令,但两个命令似乎都没有保护socks变量。为什么会有两个连续的锁定调用?似乎您的一个线程将在第二个锁上阻塞,而所有其他线程将在第一个锁上阻塞。这是因为互斥锁开始打开。因此,我认为需要两个锁来阻止线程。int变量不会被修改,线程创建是在赋值之后。有必要对该变量进行互斥吗?我明白了。但是互斥状态不应该在锁定之前通过解锁来增加?在这种情况下,锁不会阻止线程。互斥锁最初是解锁的。pthread_mutex_unlock的规范说:如果调用线程未锁定互斥锁,则尝试解锁互斥锁会导致未定义的行为。所以解锁可能没有效果。谢谢blutfink!这就是问题所在,我用POSIX信号量替换了pthread_互斥体,现在它可以完美地工作。