<分区>
在场景 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 未被阻塞...