Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在读写程序中实现争用条件?它表明了什么?我有我的代码,但它表明有问题。_C++_Openmp_Pthread Join - Fatal编程技术网

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);

            }
        }