Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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_Pthreads_Semaphore - Fatal编程技术网

C语言中读者与作者的变异

C语言中读者与作者的变异,c,pthreads,semaphore,C,Pthreads,Semaphore,我想知道是否有可能改变读者和作者的问题,使作者成为递增者和递减者?我的计划是使用pthreads创建一个随机数目的递增线程、递减线程和读取器线程,然后在计数器中保持一个运行总数,这样每当递增线程访问数据时,计数器都会上升1,反之亦然。因此,要解释一下,代码的工作方式与读写器相同,写写器以独占方式访问数据。但是线程将为writer打印输出——无论是递增还是递减,以及存储在计数器中的当前值。For reader—线程访问计数器时存储在计数器中的值 这是我目前拥有的代码,但它显然没有考虑到单独的递增器

我想知道是否有可能改变读者和作者的问题,使作者成为递增者和递减者?我的计划是使用pthreads创建一个随机数目的递增线程、递减线程和读取器线程,然后在计数器中保持一个运行总数,这样每当递增线程访问数据时,计数器都会上升1,反之亦然。因此,要解释一下,代码的工作方式与读写器相同,写写器以独占方式访问数据。但是线程将为writer打印输出——无论是递增还是递减,以及存储在计数器中的当前值。For reader—线程访问计数器时存储在计数器中的值

这是我目前拥有的代码,但它显然没有考虑到单独的递增器和递减器

#include <signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include "sem_ops.h"
#define READERS 8
#define WRITERS 3

int counter = 0;
int readers = 0;
int reader_sem;
int counter_sem;

void *writerfunc( void * arg ) { 
  int *me;

  me = (int *) arg;

  srand( time( NULL ) );
  sleep( rand() % 5 );   
  P( counter_sem );
  counter++;
  printf( "Writer Thread %d running!! counter = %d\n", *me, counter );
  V( counter_sem );

  pthread_exit( NULL );
}

void *readerfunc( void * arg ) { 
  int *me;

  me = (int *) arg;

  P( reader_sem );
  readers++;
  if( readers == 1 )
    P( counter_sem );
  V( reader_sem );

  srand( time( NULL ) );
  sleep( rand() % 5 );   
  printf( "Reader Thread %d running!! counter = %d\n", *me, counter );

  P( reader_sem );
  readers--;
  if( readers == 0 )
    V( counter_sem );
  V( reader_sem );

  pthread_exit( NULL );
}

int main( void ) {
  int i;
  pthread_t rtid[READERS];
  int readerid[READERS];
  pthread_t wtid[WRITERS];
  int writerid[WRITERS];

  counter = 0;
  reader_sem = semtran( IPC_PRIVATE );
  counter_sem = semtran( IPC_PRIVATE );
  V( counter_sem );  
  V( reader_sem );   

  for( i=0; i<READERS; i++ ) 
    readerid[i] = i;
  for( i=0; i<WRITERS; i++ ) 
    writerid[i] = i;
  for( i=0; i<WRITERS; i++ ) 
    pthread_create( &wtid[i], NULL, writerfunc, (void *) &writerid[i] );
  for( i=0; i<READERS; i++ ) 
    pthread_create( &rtid[i], NULL, readerfunc, (void *) &readerid[i] );
  for( i=0; i<WRITERS; i++ ) 
    pthread_join( wtid[i], NULL );
  for( i=0; i<READERS; i++ )
    pthread_join( rtid[i], NULL );
  return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“sem_ops.h”
#定义阅读器8
#定义编写器3
int计数器=0;
整数读取器=0;
int reader_sem;
int counter_sem;
void*writerfunc(void*arg){
int*me;
me=(int*)arg;
srand(时间(空));
睡眠(rand()%5);
P(计数器扫描电镜);
计数器++;
printf(“写入线程%d正在运行!!计数器=%d\n”,*me,计数器);
V(计数器);
pthread_exit(NULL);
}
void*readerfunc(void*arg){
int*me;
me=(int*)arg;
P(读写器);
读者++;
如果(读卡器==1)
P(计数器扫描电镜);
V(读写器);
srand(时间(空));
睡眠(rand()%5);
printf(“读线程%d正在运行!!计数器=%d\n”,*me,计数器);
P(读写器);
读者--;
如果(读卡器==0)
V(计数器);
V(读写器);
pthread_exit(NULL);
}
内部主(空){
int i;
pthread_t rtid[READERS];
int readerid[阅读器];
pthread_t wtid[写入程序];
int writerid[WRITERS];
计数器=0;
读卡器=semtran(IPC\U专用);
计数器\u sem=semtran(IPC\u专用);
V(计数器);
V(读写器);

对于(i=0;i您的具体问题是什么?“可能吗?”会得到一个“是的,当然,需要一些努力和经验。”作为答案。对于一个问题,除非您特别尝试生成一个可重复的伪随机序列,
srand()
应该在进程生命周期内调用一次;而不是每个线程调用一次。其次,请注意
rand()既不是折中也不是线程安全的标准。也请注意,函数族包括变体,如果需要的话,每个线程可以给出不同的序列。注意,您也应该仔细考虑再现性-控制种子的能力。如果需要,您可以实际复制运行结果。您的具体问题是什么?答案是“是的,当然,需要一些努力和经验。”例如,除非您特别尝试生成可重复的伪随机序列,
srand()
应该在进程生命周期内调用一次;而不是每个线程调用一次。其次,请注意
rand()既不是折中也不是线程安全的标准。也请注意,函数族包括变体,如果需要的话,每个线程可以给出不同的序列。注意,您也应该仔细考虑再现性-控制种子的能力。用于在需要时实际复制运行结果。