日期:2014-05-18  浏览次数:21997 次

请教各位线程互斥的问题。
(1)多个线程异步调用同一个静态函数,这个静态函数需要设置线程互斥吗?如果需要,麻烦指点一下比较好的实现方式。

(2)我这样控制线程,应该不会无故停止吧?(事实上在调试时曾无故停止过,不知什么原因)
public void RunETV()
{
  while(ETVState)
  {
  //线程的所有动作 
  }
}
ETVState是在主线程中控制的变量。

(3)各位谁有异步委托技术的详细资料拜托给我发一份,高分相赠。wxyf3222@sina.com

------解决方案--------------------
http://topic.csdn.net/t/20050802/17/4184140.html
http://www.autohm.com.cn/development/p401/J40149292.shtml
http://www.zaoxue.com/article/tech-27554.htm
http://hi.baidu.com/guanwei/blog/item/ee5001e92b02303cb80e2d22.html
http://www.cnblogs.com/wenwuxianren/archive/2008/04/17/1158504.html
------解决方案--------------------
最简单的就是
在要调用的部分,使用一个lock即可。

可查看 

MSDN “示例 ”“Visual C# 示例 ” “线程示例”
------解决方案--------------------
while(ETVState) 

//线程的所有动作
}
你这样写肯定不会同步的,因为判断ETVState时不能用指令完成
------解决方案--------------------
调用同一个静态函数要看函数是否有共享资源的读写,如果只是读就问题不大,如果要写,最好用信号量来锁定资源。
工作线程的循环最好不要用bool变量或者死循环配合sleep控制,用信号量等待的方式控制
异步委托可以参考backgroundWorker类
------解决方案--------------------
MARK 楼上说的有道理
------解决方案--------------------
(1)多个线程异步调用同一个静态函数,这个静态函数需要设置线程互斥吗?如果需要,麻烦指点一下比较好的实现方式。 
==================================
CLR的静态函数,静态类访问机制,已经保证的它们都是线程安全的,不需要再设置线程同步锁了。。《VIA IN C#》中有这方面的讨论。

你看看这个,但愿对你有点帮助
http://blog.csdn.net/commandos/archive/2008/03/31/2233680.aspx

(2)我这样控制线程,应该不会无故停止吧?(事实上在调试时曾无故停止过,不知什么原因) 
public void RunETV() 

while(ETVState) 

//线程的所有动作


ETVState是在主线程中控制的变量。 
==============================================
无故停止,可能是因为ETVState 被设置为false
------解决方案--------------------
可以用lock,或者
Public Sub addPstWork(ByRef pst As String)
Dim m As New Mutex
m.WaitOne()
Try
searchPst.renderListBox(pst)
Finally
m.ReleaseMutex()
End Try
End Sub
------解决方案--------------------
网上这方面的资料很多的!!
一搜一大片!!

------解决方案--------------------
给你写一段示范代码吧

C# code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication7
{
    public partial class Form1 : Form
    {
    
        System.Threading.ManualResetEvent eventObj = new System.Threading.ManualResetEvent(false);
         

        private void invokeThread()
        {
            //等待1000ms,如果没有收到终止信号则工作
            while (eventObj.WaitOne(1000,false) == false)
            {
                Console.WriteLine(Guid.NewGuid());
            }
        }
        public Form1()
        {
            InitializeComponent();
        }
        //开始
        private void button1_Click(object sender, EventArgs e)
        {
            new System.Threading.Thread(new System.Threading.ThreadStart(invokeThread)).Start();
        }
        //停止
        private void button2_Click(object sender, EventArgs e)
        {
            eventObj.Set();
        }
        //退出前停止
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            eventObj.Set();
        }
    }
}

------解决方案--------------------