日期:2014-05-17  浏览次数:20878 次

多线程同步问题 LOCK
初次接触多程序同步, 很是头疼, 望各位前辈帮帮小弟, 先谢了

C# code

namespace ThreadDemo
{
    public partial class Form1 : Form
    {
        private Yan y = new Yan();

        public Form1()
        {
            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread t1 = new Thread(T1);
            t1.Name = "t1";
            Thread t2 = new Thread(T2);
            t2.Name = "t2";

            t1.Start();
            t2.Start();
        }

        private void T1()
        {
            lock (y)
            {
                for (int i = 0; i < 10000000; ++i) ;
                y.str = "先";
                MessageBox.Show(y.str);
            }
             
        }

        private void T2()
        {
            y.str = "后";
            MessageBox.Show(y.str);
        }
    }

    public class Yan
    {
        public string str = "";
    }
}



我让他先弹出“先”, 然后再弹出“后”, 怎么搞?

求解, 谢谢!!!

------解决方案--------------------
呵呵,你用的是lock,相当于临界区,临界区无法做到控制线程执行的先后次序,只能控制两段代码不同时运行,
------解决方案--------------------
可以使用Event之类的
------解决方案--------------------
而且你在T2中也没有lock(y)这是不对的,凡是修改共享资源都要lock,要控制线程先后,你这个需求最简单的方法是用ManualResetEvent控制,当然信号量也可以,

ManualResetEvent manualEvent=new ManualResetEvent(false);

private void T1()
{
lock (y)
{
for (int i = 0; i < 10000000; ++i) ;
y.str = "先";
MessageBox.Show(y.str);
}
manualEvent.Set();

}

private void T2()
{
manualEvent.WaitOne();

lock(y)
{
y.str = "后";
MessageBox.Show(y.str);
}
}