多线程如何同步?

mulinyeyu 2012-11-01 09:32:29
我定义两个线程,如果不加lock锁定,数据有可能重复,但加上lock又达不到同步执行的效果。我该怎么改呢
...全文
142 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
欢乐的小猪 2012-11-01
  • 打赏
  • 举报
回复
多线程同步用信号量吧。
mulinyeyu 2012-11-01
  • 打赏
  • 举报
回复
我把代码贴出来,希望大牛们帮我看看

public Form1()
{
InitializeComponent();
threadOne = new Thread(new ThreadStart(Run));
threadTwo = new Thread(new ThreadStart(Run));
threadThree = new Thread(new ThreadStart(Run));
dele_display = new displayOnlineComputer(displayComputerStatus);
}


private List<string> ticketList;
private object objLock = new object();
private delegate void ListBoxCallBack();
private delegate void LableCallBack();
private void button1_Click(object sender, EventArgs e)
{
Start();
}

public void Start()
{
ticketList = new List<string>(10);
for (int i = 1; i <= 10; i++)
{
ticketList.Add(i.ToString());
}

threadOne.Start();
threadTwo.Start();
threadThree.Start();

}
private void displayComputerStatus(int on,int off)
{
label1.Text = on.ToString();
label2.Text = off.ToString();
}
private void Run()
{
int num=0;
while (ticketList.Count > 0)
{

Monitor.Enter(objLock);

if (ticketList.Count > 0)
{
string ticketNo = IcmpPacket.PingHost("192.168.0.9",64);
if(ticketNo.Contains("192.168.0.9"))
{
num++;
LableCallBack lblCallBack = delegate()
{
label1.Text = num.ToString();
};
label1.Invoke(lblCallBack);
}
ListBoxCallBack callBack = delegate()
{
richTextBox1.Text += ticketNo + "\n";


};
richTextBox1.Invoke(callBack);

ticketList.RemoveAt(0);
Thread.Sleep(1000);
}
Monitor.Exit(objLock);

}
}

SocketUpEx 2012-11-01
  • 打赏
  • 举报
回复
哪里会有同步哦
就算不加lock也不可能同步的

宝_爸 2012-11-01
  • 打赏
  • 举报
回复
只lock需要lock的地方。

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧