这是使用条件变量的正确方法吗?

时间:2016-06-17 14:15:11

标签: c multithreading pthreads

以下代码是否有任何风险?有人可以解释一下为什么我必须使用pthread_cond_broadcast而不是pthread_cond_signal吗?

#include <pthread.h>

unsigned int target_id;
pthread_mutex_t my_mytex;
pthread_cond_t my_cond;

void *print_item_(void *ar)
{
    int id = *((unsigned int*)ar);

    pthread_mutex_lock(&my_mytex);

    while (id != target_id)
        pthread_cond_wait(&my_cond, &my_mytex);

    printf("%u\n", id);
    target_id++;
    pthread_cond_broadcast(&my_cond);

    pthread_mutex_unlock(&my_mytex);
    free(ar);
    return NULL;
}

int main()
{
    pthread_t *threads;
    unsigned int *var;
    int i;

    target_id = 1;
    pthread_mutex_init(&my_mytex, NULL);
    pthread_cond_init(&my_cond, NULL);

    threads = (pthread_t*)malloc(sizeof(pthread_t)*50);

    for(i = 1; i < 50; i++)
    {
        var = (unsigned int*)malloc(sizeof(unsigned int));
        var[0] = i+1;

        pthread_create(&threads[i], NULL, print_item_, (void*)var);
    }

    var = (unsigned int*)malloc(sizeof(unsigned int));
    var[0] = 1;

    pthread_create(&threads[0], NULL, print_item_, (void*)var);

    for(i = 0; i < 50; i++)
        pthread_join(threads[i], NULL);

    free(threads);
}

1 个答案:

答案 0 :(得分:1)

您使用条件变量的方式是正确的。

您需要使用pthread_cond_broadcast()的原因是,在您的设计中,您可能有多个线程在条件变量上等待,如果条件已发出信号,则只有其中一个特定的线程可以继续处理。这意味着您需要使用pthread_cond_broadcast()所有唤醒它们,这可以确保可以继续执行可以继续的单个线程。

pthread_cond_signal()是一个优化 - 它唤醒其中一个等待线程,但没有指定哪一个,所以它只适用于等待线程的任何的情况如果醒来就能继续。

顺便说一下,调用i == 0的循环中的特殊套管线程1(pthread_create())没有任何结果。