原因在这儿: > pthread_mutex_unlock(&lock1); > if(number != 0) > { > if(isPrimeLL(number)) > { > pthread_mutex_lock(&lock2); > 这之间可能会出现线程切换 > 因为你用的全局变量。。 在 2011-12-28 12:25:20,xp2linux <xp2linux@xxxxxxxx> 写道: > >先谢谢回复! > >> 我在写一个寻找素数的多线程程序, >> 但是几次下来程序的执行结果不完全一样 >> <===是线程执行顺序 >> for(i = 0; i < l; i++) >> { >> pthread_join(tid[i], NULL); >> } >> 这儿并不能确定线程的运行顺序, > >是的,一开闸,所有线程都处于可运行 >状态了。 > >不过在我的程序中应该能保证各个线程是 >按照 numnber 由小到大来取数运行的吧。 > >> pthread_mutex_unlock(&lock1); >> if(number != 0) >> { >> if(isPrimeLL(number)) >> { >> pthread_mutex_lock(&lock2); >> 这之间可能会出现线程切换 >> > >好象是有可能出现线程切换的,两次Lock >之间存在有间隙。 > >> 我修改了下,没有测试,你自己测试下。 >> 看看能否解决段错误的问题。 >> void *finder() >> { >> long long number; >> while(1) >> { >> pthread_mutex_lock(&lock1); >> number = getNumber(); >> if( number == 0){ >> pthread_mutex_unlock(&lock1); >> pthread_exit(NULL); >> } >> if(isPrimeLL(number)) >> { >> archive[primes_found] = number; >> primes_found++; >> } >> pthread_mutex_unlock(&lock1); >> >> } >> } > >正在测试,原先的程序也不是每次都 >会出现段错误的问题,只是偶尔。 > >可能需要更多的测试才行,不过可否 >说说为什么这样修改之后就能避免段 >错误? > > > > > > >Learning, Just As Your Favourite Thing! > >Maillist, See http://www.juliantec.info/mlist/mail-lists.html >JulBlog, See http://www.juliantec.info/julblog/summary.php >JulWiki, See http://www.juliantec.info/wiki/ >JulJob, see http://www.juliantec.info/juljob/ > > Learning, Just As Your Favourite Thing! Maillist, See http://www.juliantec.info/mlist/mail-lists.html JulBlog, See http://www.juliantec.info/julblog/summary.php JulWiki, See http://www.juliantec.info/wiki/ JulJob, see http://www.juliantec.info/juljob/