尝试使用线程在C中按顺序打印数字

时间:2016-02-20 05:25:49

标签: c multithreading pthreads deadlock

我正在尝试学习线程和锁定,并编写了一个程序,使用两个线程按序列打印数字,每个线程分别打印偶数和奇数。但它似乎陷入了僵局。有人能告诉我我做错了吗?

/*
    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;
}

2 个答案:

答案 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编程!请务必阅读并理解对您的问题的评论!