我正在尝试学习线程和锁定,并编写了一个程序,使用两个线程按序列打印数字,每个线程分别打印偶数和奇数。但它似乎陷入了僵局。有人能告诉我我做错了吗?
/*
threads printing even odd number without shared variable
*/
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mux = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t even = PTHREAD_COND_INITIALIZER;
pthread_cond_t odd = PTHREAD_COND_INITIALIZER;
void print_even()
{
int i = 0;
do {
pthread_mutex_lock(&mux);
pthread_cond_wait(&odd, &mux);
i+=2;
printf("%d ", i);
pthread_cond_signal(&even);
pthread_mutex_unlock(&mux);
} while (i<100);
}
void print_odd()
{
int i = 1;
do {
pthread_mutex_lock(&mux);
pthread_cond_wait(&even, &mux);
i+=2;
printf("%d ", i);
pthread_cond_signal(&odd);
pthread_mutex_unlock(&mux);
} while (i<100);
}
int main()
{
pthread_t podd, peven;
pthread_mutex_init(&mux, NULL);
printf("The values are:\n");
pthread_create(&podd, NULL, (void *)&print_odd, NULL);
pthread_create(&peven, NULL, (void *)&print_even, NULL);
pthread_mutex_lock(&mux);
pthread_cond_signal(&even);
pthread_mutex_unlock(&mux);
pthread_join(podd, NULL);
pthread_join(peven, NULL);
printf("\ndone\n");
return 0;
}
答案 0 :(得分:0)
正如@ user3386109所提到的,主程序发送的信号太快了(在print_odd线程准备就绪之前),因此丢失导致两个线程都死锁。将编辑程序并尽快发布代码。
weightSum
答案 1 :(得分:0)
使用条件变量的方式存在缺陷。对你而言,他们自己似乎是一个沟通的渠道,需要做些什么。相反,使用它们作为指标来检查当前状态是否需要做任何事情。
伪代码:
oModel = this.getView().getModel("StackOverflow");
/*
* The model have two properties: question and comment
* I want value of TextArea to be bound to one of them based on some condition
*/
oModel.setProperty("/question", "");
oModel.setProperty("/comment", "");
oModel.setProperty("/bindTextAreaTo",
bAsk ? "StackOverflow>/question" : "StackOverflow>/comment" );
如您所见,在等待之前,线程会检查共享计数器是奇数还是偶数,然后相应地采取行动。但是,它不需要事件,特别是在main()中启动线程和发出事件信号之间没有竞争条件。
免责声明:这是应该如何使用条件变量,但它绝不是好的MT编程!请务必阅读并理解对您的问题的评论!