پر شدن صف و کنترل کردن Threadها
سلام.
میخواستم بگم من یه صف (queue) درست کردن و در اون با استفاده از چند thread مقدار وارد این صف میکنم
حالا با یه مشکلی مواجه شدم و اون هم اینه که وقتی صفم پر میشه از اطلاعات thread بعدی وارد نمیشه. و اطلاعات چندین thrad را رها میکنه
چه طوری باید این thread ها را زمانی که صف پر میشه متوقف کنم و زمانی که thread خالی میشه دوباره شروع به کار کنن؟
ممنون
نقل قول: پر شدن صف و کنترل کردن Threadها
اگه اول هر ترد پر و خالی بودن صف چک بشه فکر کنم مشکلت حل بشه.
نقل قول: پر شدن صف و کنترل کردن Threadها
نقل قول:
نوشته شده توسط
us1234
اگه اول هر ترد پر و خالی بودن صف چک بشه فکر کنم مشکلت حل بشه.
می دونم دوست عزیز:
اول بار چک میکنه که صف پر هست یا خالی بعد اگه پر بود باید چی کار کنه؟
نقل قول: پر شدن صف و کنترل کردن Threadها
راستش یکم فکر کردم اینکار راه حلی نداره جز اینکه از حالت تردی خارج بشه و بصورت تک روندی انجام بشه . هر روشی هم که ارائه بشه ( مثل استفاده از سمافور و ... ) عملا داری ترد ها را محدود میکنی تا به یک روند ساده برسی .
نقل قول: پر شدن صف و کنترل کردن Threadها
نقل قول:
نوشته شده توسط
us1234
راستش یکم فکر کردم اینکار راه حلی نداره جز اینکه از حالت تردی خارج بشه و بصورت تک روندی انجام بشه . هر روشی هم که ارائه بشه ( مثل استفاده از سمافور و ... ) عملا داری ترد ها را محدود میکنی تا به یک روند ساده برسی .
میشه بگی سمافور چیه؟
نقل قول: پر شدن صف و کنترل کردن Threadها
اگه اصرار نداری خودت بنویسی یه کلاس آماده به نام ConcurrentQueue برای این کار از قبل نوشته شده:
تمام هماهنگی ها به شکل داخلی پیاده شده. مثلاً اگه TryDequeue رو همزمان برای گرفتن مقدار از صف صدار بزنن هیچکدوم بلوک نمیشن. در صورت کشف یک تداخل یکی از دو باید سعی کنه بعداً آیتم رو برداره. تمام عملیات به شکل اتمیک انجام میشه.http://msdn.microsoft.com/en-us/library/dd267265.aspx
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
class CQ_EnqueueDequeuePeek
{
// Demonstrates:
// ConcurrentQueue<T>.Enqueue()
// ConcurrentQueue<T>.TryPeek()
// ConcurrentQueue<T>.TryDequeue()
static void Main ()
{
// Construct a ConcurrentQueue.
ConcurrentQueue<int> cq = new ConcurrentQueue<int>();
// Populate the queue.
for (int i = 0; i < 10000; i++) cq.Enqueue(i);
// Peek at the first element.
int result;
if (!cq.TryPeek(out result))
{
Console.WriteLine("CQ: TryPeek failed when it should have succeeded");
}
else if (result != 0)
{
Console.WriteLine("CQ: Expected TryPeek result of 0, got {0}", result);
}
int outerSum = 0;
// An action to consume the ConcurrentQueue.
Action action = () =>
{
int localSum = 0;
int localValue;
while (cq.TryDequeue(out localValue)) localSum += localValue;
Interlocked.Add(ref outerSum, localSum);
};
// Start 4 concurrent consuming actions.
Parallel.Invoke(action, action, action, action);
Console.WriteLine("outerSum = {0}, should be 49995000", outerSum);
}
}
نقل قول: پر شدن صف و کنترل کردن Threadها
نقل قول:
نوشته شده توسط
tooraj_azizi_1035
اگه اصرار نداری خودت بنویسی یه کلاس آماده به نام ConcurrentQueue برای این کار از قبل نوشته شده:
تمام هماهنگی ها به شکل داخلی پیاده شده. مثلاً اگه TryDequeue رو همزمان برای گرفتن مقدار از صف صدار بزنن هیچکدوم بلوک نمیشن. در صورت کشف یک تداخل یکی از دو باید سعی کنه بعداً آیتم رو برداره. تمام عملیات به شکل اتمیک انجام میشه.
http://msdn.microsoft.com/en-us/library/dd267265.aspx
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
class CQ_EnqueueDequeuePeek
{
// Demonstrates:
// ConcurrentQueue<T>.Enqueue()
// ConcurrentQueue<T>.TryPeek()
// ConcurrentQueue<T>.TryDequeue()
static void Main ()
{
// Construct a ConcurrentQueue.
ConcurrentQueue<int> cq = new ConcurrentQueue<int>();
// Populate the queue.
for (int i = 0; i < 10000; i++) cq.Enqueue(i);
// Peek at the first element.
int result;
if (!cq.TryPeek(out result))
{
Console.WriteLine("CQ: TryPeek failed when it should have succeeded");
}
else if (result != 0)
{
Console.WriteLine("CQ: Expected TryPeek result of 0, got {0}", result);
}
int outerSum = 0;
// An action to consume the ConcurrentQueue.
Action action = () =>
{
int localSum = 0;
int localValue;
while (cq.TryDequeue(out localValue)) localSum += localValue;
Interlocked.Add(ref outerSum, localSum);
};
// Start 4 concurrent consuming actions.
Parallel.Invoke(action, action, action, action);
Console.WriteLine("outerSum = {0}, should be 49995000", outerSum);
}
}
دوست عزیز ممنونم اما من با این کلاس آشنایی داشتم ولی می خوام خودم بنویسم:قلب::لبخندساده:
نقل قول: پر شدن صف و کنترل کردن Threadها
توی برنامه نویسی همروند چندین ابزار هست که بسته به نیاز میشه از اونا استفاده کرد یکی از این ابزار ها سمافور ها هستند .
سمافور را میشه مثل یک قفل در نظر گرفت که بسته به شرایط میتونه انجام کار یک ترد را pause کنه و بعد دوباره ادامه بده
تو سی شارپ دانت 4 اینجور تعریف میشه
static SemaphoreSlim sem1 = new SemaphoreSlim(1);
ابزارهای دیگه هم هست مثل فورک ، لاک و یا پارالل فور
نقل قول: پر شدن صف و کنترل کردن Threadها
نقل قول: پر شدن صف و کنترل کردن Threadها
نقل قول:
نوشته شده توسط
tooraj_azizi_1035
میشه یه توضیح کوتاه در موردش بدید اخه من از این کلاس چیزی سر در نیاوردم