PDA

View Full Version : سوال: مشکل با lock و هماهنگ کردن thread ها



karimi72
شنبه 31 خرداد 1393, 23:33 عصر
دوستان من از lock برای هماهنگ کردن threadها استفاده می کنم تا از دستکاری اطلاعات توسط یک thread دیگر جلو گیری کنم ولی در دو ریسمان من نیاز دارم دو تابع مختلف از یک شی را فراخوانی کنم این دو تابع در کار یکدیگر اختلالی ایجاد نمی کنند ولی وقتی یکی از threadها اجرا می شود شی را قفل می کند و thread دیگر نمی تواند به تابع دوم دست رسی داشته باشد به مثال زیر توجه کنید که یک مثال ساده است شاید این گونه بهتر متوجه منظور من بشوید
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System;

namespace Console_ersebari
{
abstract public class ali
{
public ali()
{
Console.WriteLine("Abstract Ali");
}
public virtual void f()
{
Console.WriteLine("ali F");
}
}

public class asghar : ali
{
static int cunt = 0;
public override void f()
{
Console.WriteLine("asghar F");
Object lockThis = new System.Object();
lock (lockThis)
{

for (int i = 0; i < 10; i++)
{
Console.WriteLine("thread 1 "+": "+i.ToString());
Thread.Sleep(1000);
}

}
}
public void asghar1()
{
Console.WriteLine("asghar tabe");
lock (this)
{

for (int i = 0; i < 10; i++)
{
Console.WriteLine("Thread 2 " +": " + i.ToString());
Thread.Sleep(1000);
}
}
}


}
public class fateme : asghar
{
public string name;
public fateme()
{
this.name = "pish farze";
}
public fateme(string a)
{
this.name = a;
}
public override void f()
{
Console.WriteLine("fateme F");

}
}

class Program
{
static void Main(string[] args)
{



ali a=new asghar();
ali b = new asghar();
Thread thread = new Thread(new ThreadStart(((asghar)a).f));
Thread thread2 = new Thread(new ThreadStart(((asghar)a).asghar1));
thread.Start();
thread2.Start();

Console.Read();
}
}
}


این مثال به نحویی ساده شده کار من است
همان طور که در مثال بالا می بینید دو تابع fو asghar1هیچ گونه تداخل داده ای ندارند و من می خواهم این توابع را در چندین thread جدا گانه اجرا کنم (مثلا 4 تا thread تابع f را اجرا کنند و 4 تا تابع asghar1را اجرا کنند )ولی در این جا هر 8 تا threadبه نوبت اجرا می شوند ولی من می خواهم thread های تابع f با asghar1 با هم اجرا دو تا دوتا اجرا شوند.
چه باید بکنم ؟