gpt4 book ai didi

c - 卡在执行多线程(Windows 上的 pthread)

转载 作者:太空宇宙 更新时间:2023-11-04 04:22:58 26 4
gpt4 key购买 nike

我希望你能在我遇到困难时帮助我。我的程序正在做一些我不太了解的事情。该计划的目的如下:创建两个线程(task_timer 和 task_read)。这些线程必须在标准输出 (stdout) 上显示以下消息:“第 1 个第 2 章第 1 个第 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;
}

在我看来,这段代码是实现这一目标的好方法。但是,它不起作用然后我想我犯了一些错误。根据我的说法,它的工作方式如下:

  1. 两个线程都是并行创建和执行的
  2. Task_read 获取互斥量 mut,等待信号同步并释放互斥量,因为信号从未到达
  3. Task_timer 获取互斥量 mut 并在标准输出上显示“Tache 1”
  4. 然后,Task_timer 发送信号 synchro 并等待信号 synchro2(释放互斥锁,因为信号永远不会到达)
  5. Task_read 接收同步信号并获取互斥量 mut 并显示“Tache 2”
  6. Task_read 发送信号 synchro2 并释放互斥体 mut 并转到 While 循环的开始
  7. Task_timer 接收信号 synchro2 并释放互斥量并转到 While 循环的开始

然而,事情并不是这样发生的。实际上,程序似乎在显示“Tache 1”后卡住了。有人可以向我解释为什么会这样吗?我想我觉得不好,但我想明白......

非常感谢,esc39

最佳答案

如果您不熟悉多线程,我建议您不要使用条件变量。您不需要为您描述的目标使用任何条件变量。因此,删除两个线程中的 pthread_cond_wait 和 pthread_cond_signal 行。

相反,您可以在每个线程中解锁互斥量后简单地添加 sleep 函数。例如task_read 可以修改为:

pthread_mutex_lock(&timer->psh->mut);    
printf("Tache 2\n");
pthread_mutex_unlock(&timer->psh->mut);
usleep(10000);

关于c - 卡在执行多线程(Windows 上的 pthread),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44502050/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com