带有广播信号的线程和互斥

时间:2018-03-07 10:10:16

标签: c linux multithreading

在方案2中为什么所有线程都没有被触发? 不同的互斥变量有什么问题?

情景1:

我正在创建四个线程。每个线程被分配到不同的核心,所有四个线程都在等待具有相同条件和互斥变量的信号。当使用相同的条件变量传递广播信号时,所有线程都被触发。

   #define _GNU_SOURCE
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<pthread.h>
    #include<sched.h>    
pthread_cond_t condVar=PTHREAD_COND_INITIALIZER;        
pthread_mutex_t mutexVar=PTHREAD_MUTEX_INITIALIZER;        
void *thread1(void *ptr)        
{        
    int iVar=1;        
    printf("Thread %d\n",iVar);        
    pthread_mutex_lock(&mutexVar);        
    pthread_cond_wait(&condVar,&mutexVar);        
    pthread_mutex_unlock(&mutexVar);        
    printf("Thread %d is unblocked...\n",iVar);        
}        

void *thread2(void *ptr)        
{        
    int iVar=2;        
    printf("Thread %d\n",iVar);        
    pthread_mutex_lock(&mutexVar);        
    pthread_cond_wait(&condVar,&mutexVar);        
    pthread_mutex_unlock(&mutexVar);        
    printf("Thread %d is unblocked...\n",iVar);        

}        

void *thread3(void *ptr)        
{        
    int iVar=3;        
    printf("Thread %d\n",iVar);        
    pthread_mutex_lock(&mutexVar);        
    pthread_cond_wait(&condVar,&mutexVar);        
    pthread_mutex_unlock(&mutexVar);        
    printf("Thread %d is unblocked...\n",iVar);        

}        

void *thread4(void *ptr)        
{        
    int iVar=4;        
    printf("Thread %d\n",iVar);        
    pthread_mutex_lock(&mutexVar);        
    pthread_cond_wait(&condVar,&mutexVar);        
    pthread_mutex_unlock(&mutexVar);        
    printf("Thread %d is unblocked...\n",iVar);        

}        


int main()        
{        
    int i,j=2;        
    pthread_t t[4];        
    cpu_set_t cpuset;        

    pthread_create(&t[0],0,thread1,0);
    pthread_create(&t[1],0,thread2,0);
    pthread_create(&t[2],0,thread3,0);
    pthread_create(&t[3],0,thread4,0);

    for(i=0;i<4;i++)            //Assign dedicated core for each thread
    {
        CPU_ZERO(&cpuset);
        CPU_SET(j,&cpuset);
        if((pthread_setaffinity_np(t[i],sizeof(cpu_set_t),&cpuset))!=0)
            perror("Set_affinity");
        j+=2;
    }
    sleep(5);
    pthread_cond_broadcast(&condVar);
    while(1);
}    

输出:

线程1

线程4

线程2

主题3

线程1未被阻止......

线程4未被阻止......

线程2未被阻止......

线程3未被阻止......

情景2:

我为每个线程创建了不同的互斥锁,而不是相同的互斥变量。在四个传递广播信号的过程中,只有一个线程被触发剩余的线程正在等待信号。

方案2的输出:

线程1

线程2

线程4

主题3

线程1未被阻止......

1 个答案:

答案 0 :(得分:1)

  

我为每个线程创建了不同的互斥锁,而不是相同的互斥变量。在四个传递广播信号的过程中,只有一个线程被触发剩余的线程正在等待信号。

这是对条件变量和未定义行为的误用。 Per the POSIX pthread_cond_wait() documentation

  

当一个线程等待一个条件变量时,为pthread_cond_timedwait()或pthread_cond_wait()操作指定了一个特定的互斥锁,就会在该互斥锁和条件变量之间形成一个动态绑定,只要至少有效条件变量上阻塞了一个线程。 在此期间,任何线程尝试使用不同的互斥锁等待该条件变量的效果都是未定义的。