【发布时间】:2017-11-14 02:01:03
【问题描述】:
我希望你能帮助我解决我的麻烦。我的程序正在做一些我不太了解的事情。 程序目的如下: 创建两个线程(task_timer 和 task_read)。 这些线程必须在标准输出 (stdout) 上显示以下消息: “第 1 个 第 2 节 第一节 第 2 节 ……”
代码:
static void* task_timer(void* arg);
static void* task_read(void* p);
struct strShared{
pthread_mutex_t mut;
pthread_mutex_t mut2;
pthread_cond_t synchro;
pthread_cond_t synchro2;
};
struct strTimer{
int wt;
strShared* psh;
};
static void* task_timer(void* p){
time_t echeance;
strTimer* timer;
int time_waiting = 1000;
time_t now;
if(p != NULL){
timer = p;
time_waiting = timer->wt; //ms
echeance = time (NULL) + TIME_OF_THREAD;
while (1)
{
pthread_mutex_lock(&timer->psh->mut);
printf("Tache 1\n");
pthread_cond_signal(&timer->psh->synchro);
pthread_cond_wait(&timer->psh->synchro2, &timer->psh->mut);
pthread_mutex_unlock(&timer->psh->mut);
}
}
return NULL;
}
static void* task_read(void* p){
strTimer* timer;
if(p != NULL){
timer = p;
while(1){
pthread_mutex_lock(&timer->psh->mut);
pthread_cond_wait(&timer->psh->synchro, &timer->psh->mut);
printf("Tache 2\n");
pthread_cond_signal(&timer->psh->synchro2);
pthread_mutex_unlock(&timer->psh->mut);
}
}
return NULL;
}
int main (void)
{
pthread_t ttimer;
pthread_t tread;
/* TIMER */
strTimer timer;
strShared shtimer;
shtimer.mut = PTHREAD_MUTEX_INITIALIZER;
shtimer.mut2 = PTHREAD_MUTEX_INITIALIZER;
shtimer.synchro = PTHREAD_COND_INITIALIZER;
shtimer.synchro2 = PTHREAD_COND_INITIALIZER;
timer.psh = &shtimer;
timer.wt = 1000;
/* Threads */
pthread_create(&ttimer, NULL, task_timer, &timer);
pthread_create(&tread, NULL, task_read, &timer);
pthread_join(ttimer,NULL);
pthread_join(tread,NULL);
return 0;
}
在我看来,这段代码是实现这一目标的好方法。但是,它不起作用,然后我想我犯了一些错误。据我说,它的工作方式如下:
- 两个线程都是并行创建和执行的
- Task_read 获取 mutex mut,等待信号同步并释放 mutex,因为信号永远不会到达
- Task_timer 获取 mutex mut 并在标准输出上显示“Tache 1”
- 然后,Task_timer 发送信号 synchro 并等待信号 synchro2(释放互斥锁,因为信号永远不会到达)
- Task_read 接收到同步信号并获取 mutex mut 并显示“Tache 2”
- Task_read 发送信号 synchro2 并释放 mutex mut 并转到 While 循环的开头
- Task_timer 接收到信号 synchro2 并释放互斥体并转到 While 循环的开头
然而,事情并不是这样发生的。实际上,似乎程序在显示“Tache 1”后卡住了。有人可以解释一下为什么会这样吗?我想我觉得不好,但我想理解......
非常感谢, esc39
【问题讨论】:
-
首先:为什么你认为
task_read会首先获得互斥锁?如果两个线程争夺锁,您无法预测哪一个会被授予锁。从程序员的角度来看,您可以将其视为随机的。所以,请分析一下task_timer先获取锁会发生什么。 -
您好,感谢您的回答。是的,我假设了这种情况,但我知道还有另一种情况。无论如何,pthread_cond_wait 都会强制 task_read 等待信号。
-
不,不会。请编辑您的问题并分析案例
task_timer先获取锁。 -
提示:信号没有排队。如果在没有人等待的情况下发送信号,它就会丢失。
标签: c multithreading synchronization pthreads