2016-10-28 59 views
0

目前我很困惑,为什么下面的代码不会打印以下:了解并行线程

My value is 0 
My value is 1 
My value is 2 

每次我运行此我要么得到1-2印刷线或没有,程序只是坐在他们直到我ctrl-c。我觉得这可能与我使用3个不同的线程使用相同的条件变量和互斥量有关,这是否正确?任何解释都非常感谢。

#include <stdio.h> 
#include <pthread.h> 
#include <assert.h> 
#include <unistd.h> 
#include <stdlib.h> 

struct id_holder 
{ 
int id; 
}; 

pthread_mutex_t intersectionMutex = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t directionCondition = PTHREAD_COND_INITIALIZER; 
struct id_holder * holder; 

void * logic(void* val) 
{ 
    struct id_holder * id_struct = (struct id_holder *) val; 

    pthread_cond_wait(&directionCondition, &intersectionMutex); 
    printf("My value is %d\n", id_struct->id); 
    free(id_struct); 
    return NULL; 
} 

int main(void) 
{ 
    pthread_t threads[3]; 

    for(int i = 0; i <3; i++) 
    { 
     holder = (struct id_holder *) malloc(sizeof(struct id_holder)); 
     holder->id = i; 
     pthread_create(&threads[i], NULL, logic, holder); 
    } 

    for(int i = 0; i < 3; i++) 
    { 
     sleep(1); 
     pthread_cond_signal(&directionCondition); 
    } 

    for(int i = 0; i < 3; i++) 
    { 
     pthread_join(threads[i], NULL); 
    } 

    return 0; 
} 

回答

3

当条件等待或暗示,它必须锁定下进行,否则,行为是不可预测的,因为它可以进入比赛状态。因此,你的代码应该是这样的:

pthread_mutex_lock(&intersectionMutex); 
pthread_cond_wait(&directionCondition, &intersectionMutex); 
pthread_mutex_unlock(&intersectionMutex); 

而对于主一样(如果你愿意,你可以移动,循环外的锁):

for(int i = 0; i < 3; i++) { 
    sleep(1); 
    pthread_mutex_lock(&intersectionMutex); 
    pthread_cond_signal(&directionCondition); 
    pthread_mutex_unlock(&intersectionMutex); 
} 

依然代码也不是100%安全的主线程可以在子线程调用等待之前发信号通知状态。虽然在主函数中由于sleep()而非常不可能,但通常应该有一个变量来确定等待是否真的需要。换句话说,条件不是队列,但可以用来创建队列。