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

C 这是使用条件变量的正确方法吗?,c,multithreading,pthreads,C,Multithreading,Pthreads,以下代码是否存在任何风险?有人能解释一下为什么我必须使用pthread\u cond\u broadcast而不是pthread\u cond\u 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\u cond\u broadcast
而不是
pthread\u cond\u 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);
}
#包括
无符号整数目标\ u id;
pthread_mutex_t my_mytex;
pthread_cond_t my_cond;
作废*打印项目(作废*应收)
{
int id=*((无符号int*)ar);
pthread_mutex_lock(&my_mytex);
while(id!=目标\u id)
pthread_cond_wait(&my_cond,&my_mytex);
printf(“%u\n”,id);
目标_id++;
pthread_cond_广播(&my_cond);
pthread_mutex_unlock(&my_mytex);
免费(ar);
返回NULL;
}
int main()
{
pthread_t*线程;
无符号int*var;
int i;
target_id=1;
pthread_mutex_init(&my_mytex,NULL);
pthread_cond_init(&my_cond,NULL);
线程=(pthread_t*)malloc(sizeof(pthread_t)*50);
对于(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=(unsigned int*)malloc(sizeof(unsigned int));
var[0]=1;
pthread_create(&threads[0],NULL,print_item(void*)变量);
对于(i=0;i<50;i++)
pthread_join(线程[i],NULL);
自由(螺纹);
}

您在那里使用条件变量的方式是正确的

您需要使用
pthread\u cond\u broadcast()
的原因是,在您的设计中,可能有多个线程等待条件变量,其中只有一个特定的线程可以在条件发出信号时继续。这意味着您需要使用
pthread\u cond\u broadcast()
将它们全部唤醒,从而确保可以继续的单个线程将被唤醒

pthread\u cond\u signal()
是一种优化-它唤醒一个等待的线程,但没有指定哪个线程,因此它仅适用于任何等待的线程在被唤醒时都可以继续的情况


顺便说一句,在调用
pthread_create()

@4386427的循环中,特殊套管螺纹1(
i==0
)没有得到任何帮助!我的意思是为什么在我的例子中pthread_cond_wait不起作用。@4386427是的,如果我这样做,程序将永远暂停。为什么?你有大量的内存泄漏。您不是
free
ing
malloc
ated vars…因为没有人解锁挂起条件值的线程…好的,这很有意义:-)信号只释放一个线程。如果该线程没有下一个目标id,则会出现死锁。广播将释放所有线程,以便执行具有正确目标id的线程。看见