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

C段错误-读写器

C段错误-读写器,c,segmentation-fault,pthreads,semaphore,readerwriterlock,C,Segmentation Fault,Pthreads,Semaphore,Readerwriterlock,我试图在C中实现读写器问题的一个变体,变体是写器可以是递增的,也可以是递减的,它们应该保持一个运行计数。下面是我试图实现的代码,我得到了错误分段错误核心转储。我尝试过调试,并在main中收到了来自gdb-0 0x0000000000400d84的反馈。 如果有人能向我解释一下/给我一些如何修复此故障的提示,我将不胜感激。 谢谢 可疑:pthread_joinreaders[i],NULL pthread_join的第二个参数应该是var的有效地址,以包含来自现有子线程的返回值的地址。在这种情况下

我试图在C中实现读写器问题的一个变体,变体是写器可以是递增的,也可以是递减的,它们应该保持一个运行计数。下面是我试图实现的代码,我得到了错误分段错误核心转储。我尝试过调试,并在main中收到了来自gdb-0 0x0000000000400d84的反馈。 如果有人能向我解释一下/给我一些如何修复此故障的提示,我将不胜感激。 谢谢

可疑:pthread_joinreaders[i],NULL

pthread_join的第二个参数应该是var的有效地址,以包含来自现有子线程的返回值的地址。在这种情况下,当一个子线程退出时,pthread_exit尝试在NULL处写入NULL,我认为这是导致seg错误的原因。尝试将NULL更改为pthread_join中读写器和写操作的某个有效地址,看看它是否有效


编辑:事实证明POSIX允许将NULL传递给pthread_join,请参见下面的注释,所以疑犯被无罪释放

如果rand返回@WhozCraig注释中指出的大数字,则可能会耗尽堆栈空间

如果您只是指定一些有限值,而不是在此处使用rand:

  int numReaders = rand();
  int numWriters = rand();

我看到它运行时没有分段错误

rand可以返回一个相当大的数字。然而,这正是你用来计算线程数和数组大小的方法,这简直是疯了。也许您应该将其限制在合理的范围内,包括下限值>0且小于(比如)8。仅供参考,在线程上也使用rand,这是出了名的非线程安全。的POSIX规范允许第二个参数为空指针,在这种情况下不返回任何值。这种用法是允许的。谢谢@JonathanLeffler你是对的。可能是RAND_MAX>PTHREAD_THREADS_MAX,所以PTHREAD_create是错误的吗?
  int numReaders = rand();
  int numWriters = rand();