C:线程与互斥同步
我有一个多线程同步的问题,我将只张贴一个例子,我正在做什么尝试同步,因为原始代码更大。 基本上,我有一个连接了3个线程的繁重进程,为了锁定/解锁线程,我使用修改每个线程中互斥状态的函数。大概是这样的: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
## 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_互斥体,现在它可以完美地工作。