کسی کار با threadها رو در c++ بلده؟

mig123

New Member
با سلام،
اگر ممکن است به سوال زیر پاسخ بدید. در قطعه کد زیر برای اینکه هر لیست محلی خود را با لیست سراسری Path ادغام کند خطای زیر رخ میده. اولین باری که ترد لیست خودشو به لیست سراسری الحاق می کنه مشکلی نیست اما بار دوم که می خواد اینکار رو بکنه پیام sequence not order داده میشه.
کد:
 [COLOR=blue][FONT=&quot]if[/FONT][/COLOR][FONT=&quot] (flag == 1)[/FONT]
  [FONT=&quot]                        {     [/FONT]
  [FONT=&quot]                              WaitForSingleObject(mutPath, INFINITE);[COLOR=green]//Lock[/COLOR][/FONT]
  [FONT=&quot]                              tmpPath = LocalPath;[/FONT]
  [FONT=&quot]                              Path.merge(tmpPath);[/FONT]
  [FONT=&quot]                              ReleaseMutex(mutPath);[COLOR=green]//Unlock[/COLOR][/FONT]
  [FONT=&quot]                              flag=0;[/FONT]
  [FONT=&quot]                        }[/FONT]
 

the_king

مدیرکل انجمن
با سلام،
اگر ممکن است به سوال زیر پاسخ بدید. در قطعه کد زیر برای اینکه هر لیست محلی خود را با لیست سراسری Path ادغام کند خطای زیر رخ میده. اولین باری که ترد لیست خودشو به لیست سراسری الحاق می کنه مشکلی نیست اما بار دوم که می خواد اینکار رو بکنه پیام sequence not order داده میشه.
کد:
 if (flag == 1)
                          {     
                                WaitForSingleObject(mutPath, INFINITE);//Lock
                                tmpPath = LocalPath;
                                Path.merge(tmpPath);
                                ReleaseMutex(mutPath);//Unlock
                                flag=0;
                          }

شرط اجرا شدن ()merge این است هر دو مجموعه مرتب باشند.
باید هم tmpPath و هم Path قبل از merge شدن مرتب باشند، اگر مرتب نباشند این خطا رخ می دهد :
کد:
 if (flag == 1)
                          {     
                                WaitForSingleObject(mutPath, INFINITE);//Lock
                                tmpPath = LocalPath;
[B][COLOR="Blue"]				Path.sort();
				tmpPath.sort();[/COLOR][/B]
                                Path.merge(tmpPath);
                                ReleaseMutex(mutPath);//Unlock
                                flag=0;
                          }
 

mig123

New Member
[font=&quot]با سلام مجدد[/font]​
[font=&quot]آقای مدیر من برنامه مو تیکه تیکه نوشتم و اصلاح کردم، ایرادش فقط مربوط به قسمتیه که حلقه ای نوشتیم برای اینکه متنظر پایان کار تردهای ایجاد شده بمونه و بعد اینکه کار همه تردها خاتمه پیدا کرد به ترد اصلی برگرده. اگه براتون ممکنه لطفا بررسی کنید. خطوط 674 تا 678
[/font]
[font=&quot]
[/font]

 

پیوست ها

  • KDLA4.zip
    4.9 کیلوبایت · بازدیدها: 2

the_king

مدیرکل انجمن
با سلام مجدد
آقای مدیر من برنامه مو تیکه تیکه نوشتم و اصلاح کردم، ایرادش فقط مربوط به قسمتیه که حلقه ای نوشتیم برای اینکه متنظر پایان کار تردهای ایجاد شده بمونه و بعد اینکه کار همه تردها خاتمه پیدا کرد به ترد اصلی برگرده. اگه براتون ممکنه لطفا بررسی کنید. خطوط 674 تا 678

ایراد از ()WaitForThread نیست.

مورد اول : بعد از اینکه Thread های ایجاد شده همگی اجرایشان خاتمه پیدا کرد بی زحمت threadHandles رو
خالی کنید :
کد:
		for (it3 = threadHandles.begin(); it3 != threadHandles.end(); it3++)
		{
			WaitForThread(*it3);				
		}
[B][COLOR="Blue"]		threadHandles.clear();[/COLOR][/B]

مورد دوم : اگر حلقه پیمایش LocalPath است، شرط حلقه را روی سایز LocalPath قرار دهید، نه Tmp_Path
همچنین d یک منبع مشترک است، mutex اش را فراموش نکنید :
کد:
			if(LocalPath.size()>1)
			{
[B][COLOR="Blue"]				WaitForSingleObject(mutd, INFINITE);//Lock[/COLOR][/B]
				itr1 = LocalPath.begin();
				for (unsigned int i = 0; i < [B][COLOR="Blue"]LocalPath.size()[/COLOR][/B]-1; i++)
				{	
					int x = *itr1; 
					int y = *(++itr1);
					d.dla.at(x).RewardAndPenalty(y, 0);
				}
[B][COLOR="Blue"]				ReleaseMutex(mutd);//Unlock[/COLOR][/B]
			}//end if
 

mig123

New Member
خیلی از لطف شما ممنونم.:rose:
اگه اجازه بدید یه سوال دیگه بپرسم، برنامه درست کار میکنه، اما به نظر شما چطور میشه سرعت اجرای برنامه رو بالاتر برد؟ چون کارایی برنامه و زمان اجراش برام مهمه.
 

جدیدترین ارسال ها

بالا