[juliantec_list] Re:Re: Re:多线程互斥问题

  • From: "J.evan" <free123ba@xxxxxxx>
  • To: xp2linux <xp2linux@xxxxxxxx>
  • Date: Wed, 28 Dec 2011 12:34:02 +0800 (CST)

原因在这儿:
>      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/



Other related posts: