C++ 如何在读写程序中实现争用条件?它表明了什么?我有我的代码,但它表明有问题。
我想在这段代码中添加一个争用条件,以便 理解线程的本质。但我没能挺过去 这个代码C++ 如何在读写程序中实现争用条件?它表明了什么?我有我的代码,但它表明有问题。,c++,openmp,pthread-join,C++,Openmp,Pthread Join,我想在这段代码中添加一个争用条件,以便 理解线程的本质。但我没能挺过去 这个代码 #包括 #包括 #包括 #包括 扫描电镜; 扫描电镜; int readCount=0; int writeCount=0; void*读卡器(void*arg); void*编写器(void*arg); int main() { int i=0,NumberofReaderThread=0,NumberofWriterThread=0,TID,nthreads; sem_init(&rsem,0,1); sem_
#包括
#包括
#包括
#包括
扫描电镜;
扫描电镜;
int readCount=0;
int writeCount=0;
void*读卡器(void*arg);
void*编写器(void*arg);
int main()
{
int i=0,NumberofReaderThread=0,NumberofWriterThread=0,TID,nthreads;
sem_init(&rsem,0,1);
sem_init(&wsem,0,1);
pthread_t Readers_thr[100],Writer_thr[100];
printf(“\n输入读卡器线程数(最多10):”;
scanf(“%d”,&NumberofReaderThread);
printf(“\n输入写入线程数(最多10):”;
scanf(“%d”,&NumberofWriterThread);
对于(i=0;i)如何在读写器程序中实现争用条件,您的意思是什么?您是否试图创建死锁?是的,我正在尝试创建一个两个线程同时读取数据库的条件,这会导致某种死锁条件,因为资源分配发生在并发实例的时间。
#include<stdio.h>
#include<pthread.h>
#include<semaphore.h>
#include<omp.h>
sem_t rsem;
sem_t wsem;
int readCount=0;
int writeCount=0;
void *Reader(void *arg);
void *Writer(void *arg);
int main()
{
int i=0,NumberofReaderThread=0,NumberofWriterThread=0,TID, nthreads;
sem_init(&rsem,0,1);
sem_init(&wsem,0,1);
pthread_t Readers_thr[100],Writer_thr[100];
printf("\nEnter number of Readers thread(MAX 10) : ");
scanf("%d",&NumberofReaderThread);
printf("\nEnter number of Writers thread(MAX 10) : ");
scanf("%d",&NumberofWriterThread);
for(i=0;i<NumberofReaderThread;i++)
{
pthread_create(&Readers_thr[i],NULL,Reader,(void *)i);
}
for(i=0;i<NumberofWriterThread;i++)
{
pthread_create(&Writer_thr[i],NULL,Writer,(void *)i);
}
for(i=0;i<NumberofWriterThread;i++)
{
pthread_join(Writer_thr[i],NULL);
}
for(i=0;i<NumberofReaderThread;i++)
{
pthread_join(Readers_thr[i],NULL);
}
i=0;
pthread_create(&Readers_thr[i],NULL,Reader,(void *)i);
pthread_create(&Writer_thr[i],NULL,Writer,(void *)i);
i=1;
pthread_create(&Readers_thr[i],NULL,Reader,(void *)i);
pthread_create(&Writer_thr[i],NULL,Writer,(void *)i);
i=0;
pthread_join(Writer_thr[i],NULL);
pthread_join(Readers_thr[i],NULL);
i=1;
pthread_join(Writer_thr[i],NULL);
pthread_join(Readers_thr[i],NULL);
sem_destroy(&rsem);
sem_destroy(&wsem);
return 0;
}
void * Writer(void *arg)
{
int TID, nthreads,temp;
#pragma omp parallel default(none), private(TID), shared(nthreads,wsem,rsem,temp,arg,writeCount)
{
//sleep(3);
TID = omp_get_thread_num();
if (TID == 0)
{
nthreads = omp_get_num_threads();
printf("\n Number of threads = (%d) \n",nthreads);
}
temp=(int)arg;
printf("\n Thread %d :: Writer %d is trying to enter into database ",TID,temp);
sem_wait(&wsem);
writeCount++;
if(writeCount==1) sem_wait(&rsem);
printf("\n Thread %d :: Writer %d is writing into the database ",TID,temp);
//sleep(5);
printf("\n Thread %d :: Writer %d is leaving the database ",TID,temp);
sem_post(&wsem);
sem_post(&rsem);
}
}
void *Reader(void *arg)
{
int TID, nthreads,temp;
#pragma omp parallel default(none), private(TID),shared(nthreads,wsem,rsem,readCount,temp,arg)
{
//sleep(3);
TID = omp_get_thread_num();
if (TID == 0)
{
nthreads = omp_get_num_threads();
printf("\n Number of threads = (%d) \n",nthreads);
}
temp=(int)arg;
printf("\n Thread %d :: Reader %d is trying to enter into the Database ",TID,temp);
sem_wait(&rsem);
readCount++;
if(readCount==1)
{
sem_wait(&wsem);
//sleep(5);
printf("\n Thread %d :: Reader %d is reading the database ",TID,temp);
}
sem_post(&rsem);
printf("\n Thread %d :: Reader %d is reading the database ",TID,temp);
sem_wait(&rsem);
readCount--;
printf("\nThread %d :: Reader %d is leaving the database ",TID,temp);
if(readCount==0)
{
sem_post(&wsem);
}
sem_post(&rsem);
}
}