C语言 具有广播信号的线程和互斥锁



在场景 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 %dn",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 %dn",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 %dn",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 %dn",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 已解锁...

我没有使用相同的

互斥体变量,而是为每个线程创建了不同的互斥锁。在四个线程之间传递广播信号时,只有一个线程被触发,其余线程正在等待信号。

这是对条件变量和未定义行为的误用。根据 POSIXpthread_cond_wait()文档:

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

最新更新