PDA

View Full Version : سوال: متد Join در ریسمان ها



irpersian20
شنبه 19 مرداد 1392, 00:58 صبح
با سلام
من چند تا مثال دیدم اما گیج شدم!
وقتی یک ترد رو Join میکنیم . ترد اصلی برنامه دیگه فراخوانی ترد های دیگر رو کنار میزاره و تا اتمام کار ترد فعلی که جوین شده.صبر میکنه؟
Blocks the calling thread until a thread terminates, while continuing to perform standard COM and SendMessage pumping.



using System;
using System.Threading;

class Example
{
static void Main()
{
Thread t1 = new Thread(() =>
{
Thread.Sleep(4000);
Console.WriteLine("t1 is ending.");
});
t1.Start();

Thread t2 = new Thread(() =>
{
Thread.Sleep(1000);
Console.WriteLine("t2 is ending.");
});
t2.Start();

t1.Join();
Console.WriteLine("t1.Join() returned.");

t2.Join();
Console.WriteLine("t2.Join() returned.");
}
}

/* This example produces the following output:

t2 is ending.
t1 is ending.
t1.Join() returned.
t2.Join() returned.
*/


The Thread.Join method is called on the main thread to let it wait until the other thread finishes
using System;
using System.Threading;
namespace Chapter1
{
public static class Program
{
public static void ThreadMethod()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(“ThreadProc: {0}”, i);
Thread.Sleep(0);
}
}
public static void Main()
{
Thread t = new Thread(new ThreadStart(ThreadMethod));
t.Start();
for (int i = 0; i < 4; i++)
{
Console.WriteLine(“Main thread: Do some work.”);
Thread.Sleep(0);
}
t.Join();
}
}
}

tooraj_azizi_1035
شنبه 19 مرداد 1392, 11:10 صبح
ترد اصلی برنامه دیگه فراخوانی ترد های دیگر رو کنار میزاره و تا اتمام کار ترد فعلی که جوین شده.صبر میکنه؟
اجرای ترد فراخواننده رو متوقف می کنه نه همه تردها (یعنی تردی که Join رو فراخونی کرده) تا اینکه اجرای ترد مربوطه تموم بشه.
معمولاً زمانی که ادامه اجرای برنامه وابسته به اتمام اجرای یک متد است.

irpersian20
شنبه 19 مرداد 1392, 11:23 صبح
سلام
پس خط 24 برنامه دوم چه معنی میتونه داشته باشه؟ اینجا که یک ترد برنامه اصلی داریم و یک ترد که ایجاد کردیم.چرا جوین کرده؟ چرا باید ترد که ایجاد کردیم رو اینجا متوقف کنیم؟ ممنونم

plus
شنبه 19 مرداد 1392, 13:06 عصر
یکم مثالش گیج کنندس، احتمالا به این خاطر join گذاشته شده که ترد اصلی قبل از ترد ساخته شده، بسته نشه.فکر میکنم توی شرایطی، بسته شدن ترد اصلی میتونه موجب بسته شدن سایر ترد ها بشه...
پ.ن : اگه Thread ی که ساختین از نوع Background Thread باشه، یعنی مشخصه IsBackground اون true باشه، با به اتمام رسیدن ترد اصلی، اگه ترد فرعی در حال اجرا باشه، سیستم عامل اون رو میبنده و منتظر اتمامش نمیمونه.

tooraj_azizi_1035
شنبه 19 مرداد 1392, 13:06 عصر
تصمیم بر اینکه چه زمانی از Join باید استفاده کرده بستگی به منطق برنامه داره.
مثلاً اگر در یک برنامه بخواهیم میانگین اعداد اول بین 1 تا 100000 را بدست آوریم و بخواهیم این کار را موازی انجام دهیم می توانیم کار را بین 4 ترد تقسیم کنیم و نهایتاً خروجی های بدست آمده را تقسیم بر تعداد کنیم.
در این برنامه باید منتظر باشیم تا خروجی همه ترد ها بدست بیاید و بعد میانگین بگیریم و آن را به کاربر نمایش دهیم.
در این حالت باید هر 4 ترد Join شوند و ما بعد از Join نتایج را برای محاسبه میانگین با هم جمع کنیم.
در کل اگر ادامه اجرای برنامه وابسته به خروجی ترد های دیگر باشد باید از این متد استفاده کرد. (البته روش های دیگری هم وجود دارد).

irpersian20
یک شنبه 20 مرداد 1392, 17:07 عصر
سلام
شاید 20 بار خودنم اما نمیفهمم join رو
این مثال اول من رو گیج کرده

FastCode
یک شنبه 20 مرداد 1392, 22:32 عصر
مثال اول خیلی قشنگ نیست
چند تا مثال خیلی زیبا:
http://stackoverflow.com/questions/2476552/what-is-the-significance-of-thread-join-method-in-c

irpersian20
دوشنبه 21 مرداد 1392, 00:13 صبح
مثال اول خیلی قشنگ نیست
چند تا مثال خیلی زیبا:
http://stackoverflow.com/questions/2476552/what-is-the-significance-of-thread-join-method-in-c
سلام
آقا این قسمت o میشه توضیح دهید؟ بجاش () بزنیم. ظاهرا فرق نمیکنه
int fibsum = 1;

Thread t = new Thread(o =>
{
for (int i = 1; i < 20; i++)
{
fibsum += fibsum;
}
});

t.Start();
t.Join(); // if you comment this line, the WriteLine will execute
// before the thread finishes and the result will be wrong
Console.WriteLine(fibsum);

FastCode
دوشنبه 21 مرداد 1392, 00:29 صبح
خیر, فرقی نداره.
برای اینکه تقاوت رو متوجه بشید اون عدد ۲۰ رو زیاد کنید مثلا 2147483647 و بعد از start یک دستور وقت گیر کوچکتر بنویسید.بعد برای دیدن تفاوت Join رو بردارید و بزارید.