C段错误-读写器
我试图在C中实现读写器问题的一个变体,变体是写器可以是递增的,也可以是递减的,它们应该保持一个运行计数。下面是我试图实现的代码,我得到了错误分段错误核心转储。我尝试过调试,并在main中收到了来自gdb-0 0x0000000000400d84的反馈。 如果有人能向我解释一下/给我一些如何修复此故障的提示,我将不胜感激。 谢谢 可疑:pthread_joinreaders[i],NULL pthread_join的第二个参数应该是var的有效地址,以包含来自现有子线程的返回值的地址。在这种情况下,当一个子线程退出时,pthread_exit尝试在NULL处写入NULL,我认为这是导致seg错误的原因。尝试将NULL更改为pthread_join中读写器和写操作的某个有效地址,看看它是否有效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的有效地址,以包含来自现有子线程的返回值的地址。在这种情况下
编辑:事实证明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();