【发布时间】: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