主线程ThreadMain和从线程ThreadChild同时需要访问一个变量A,从线程ThreadChild首先给此变量A使用lock加锁,在从线程ThreadChild还没有放开对变量A的加锁的时候,主线程ThreadMain也开始使用lock试图对变量A加锁使用,为什么在主线程ThreadMain开始阻塞的时候,其它所有的线程(包括正在对变量A拥有加锁的从线程ThreadChild)都被阻塞了?能不能帮着解释一下!!!!

解决方案 »

  1.   

    下面是代码,首先单击button1开始执行ChildThreadMethod,然后单击button2开始执行MainThreadMethod。 static void Main() 
    {
    Application.Run(new Form1());
    } delegate void delegateShowValueInForm ();
    private void ChildThreadMethod ()
    {
    System.Threading.Monitor.Enter(_objectShareData);


    while (_objectShareData.iShareData<50)
    {

    System.Threading.Thread.Sleep(100);
    _objectShareData.iShareData++;
    ShowValueInForm();

    }
    System.Threading.Monitor.Exit(_objectShareData);


    }
    private void ShowValueInForm()
    {
    if (this.InvokeRequired)
    {
    this.Invoke(new delegateShowValueInForm(ShowValueInForm));
    }
    else
    {
    textBox1.Text=_objectShareData.iShareData.ToString();
    }
    } private void button1_Click(object sender, System.EventArgs e)
    {
    threadChild = new System.Threading.Thread(new System.Threading.ThreadStart(ChildThreadMethod));
    threadChild.Start();

    } private void MainThreadMethod()
    {
    System.Threading.Monitor.Enter(_objectShareData);
    _objectShareData.iShareData=10000;
    System.Threading.Monitor.Exit(_objectShareData);


    MessageBox.Show(_objectShareData.iShareData.ToString());
    } private void button2_Click(object sender, System.EventArgs e)
    {
    MainThreadMethod();
    }
    } public class DataObject
    {
    public int iShareData=0;
    }
      

  2.   

    其它所有的线程(包括正在对变量A拥有加锁的从线程ThreadChild)都被阻塞了?你是怎么知道的?在调试的线程列表里?
      

  3.   

    你的子线程入口函数不对,已进入子线程就lock对象了,直到子线程结束才释放,修改你的子线程入口函数,把锁定区放到循环中,如下:
    while (_objectShareData.iShareData<50)
    {System.Threading.Thread.Sleep(100);System.Threading.Monitor.Enter(_objectShareData);//Enter critical region
    _objectShareData.iShareData++;
    ShowValueInForm();
    System.Threading.Monitor.Exit(_objectShareData); //Leave critical region}
      

  4.   

    谢谢愚翁。按照你的写法确实可以了,不过为什么将Lock放在子线程入口处就会阻塞所有线程呢?按道理讲只有等待Lock同一对象(_objectShareData)的线程(本例子中是主线程MainThread)才会被阻塞,其它的所有线程应该都不会受影响才对阿?
    按照我最开始的写法,把Lock放在子线程入口处,在子线程的方法里添一行System.Diagnostics.Debug.WriteLine(System.DateTime.Now.ToString());结果连这个都不被输出了,所以我觉得其它的线程都被阻塞了,包括正在拥有锁的线程。
    private void ChildThreadMethod ()
    {
    System.Threading.Monitor.Enter(_objectShareData);
    while (_objectShareData.iShareData<50)
    {
    System.Diagnostics.Debug.WriteLine(System.DateTime.Now.ToString());
    System.Threading.Thread.Sleep(100);
    _objectShareData.iShareData++;
    ShowValueInForm();
    }
    System.Threading.Monitor.Exit(_objectShareData);
    }
      

  5.   

    你如下写
    private void ChildThreadMethod ()
    {
    System.Threading.Monitor.Enter(_objectShareData);//Enter critical region
    while (_objectShareData.iShareData<50)
    {
    System.Diagnostics.Debug.WriteLine(System.DateTime.Now.ToString());
    System.Threading.Thread.Sleep(100);
    _objectShareData.iShareData++;
    ShowValueInForm();
    }
    System.Threading.Monitor.Exit(_objectShareData);//Leave critical region
    }你看了以上的注释,应该很明白了吧,我就不多说了。