现在我有3个线程,对应处理函数分别是主要线程master(),和两个辅助线程slaver1(),slaver2()其中slaver1和slaver2线程从串口读取数据data1和data2,然后master要取data1和data2数据来用master对于data1和data2只读取不修改,请问这种情况是否要设置同步锁?后来我设置了一个ManualResetEvent锁,代码如下:master()
{
ManualResetEvent.reset();
我自己的处理代码,读取data1和data2;
ManualResetEvent.set();
}slaver1()
{
ManualResetEvent.waitone();
data1 = 从串口读取数据;
}slaver2()
{
ManualResetEvent.waitone();
data2 = 从串口读取数据;
}请问这段代码有没有什么问题实际情况中master接受完data1和data2后,要通过网络往别处送信息,运行一段时间后老死机
是否会和线程同步有关?

解决方案 »

  1.   

    我咋觉得你这代码写的有问题呢?按照你描述的好像不应该你这样写吧?
    也许是我没理解ManualResetEvent的用法?
    你的主线程是要用2个辅助线程获取的数据 那你现在这样写能保证你的主线程可以访问到2个辅助线程中的数据吗?
    也就是你好像没有保证你的主线程进入处理data1 和data2的时候2个辅助线程都结束不知道我理解的对不对?
      

  2.   

    我觉得用autoresetevent就可以了吧?
      

  3.   

    发送出去后等待salve线程返回。用LOCK锁定主线程。设置最长等待时间。超时抛异常或重发。
      

  4.   

            private void button1_Click(object sender, EventArgs e)
            {
                autoEvent = new AutoResetEvent(false);
                Thread t1 = new Thread(new ThreadStart(sayhello));
                t1.Start();
                autoEvent.WaitOne();//阻塞当前线程并等待t1执行完成
                  Thread t2 = new Thread(new ThreadStart(sayword));
                t2.Start();
            }
            void sayhello()
            {
                autoEvent.Reset();//设置等待事件,使其他线程等待该方法
                MessageBox.Show("hello");
                autoEvent.Set();//通知其他线程该方法执行完成
            }
            void sayword()
            {
                MessageBox.Show("word");
            }
    看看这个方法行不行?