111,120
社区成员
发帖
与我相关
我的任务
分享
private object _iTest=0;
private void Button1_Click(...)
{
WaitCallback myCallback = new WaitCallback (tt);
ThreadPool.QueueUserWorkItem (myCallback);
ThreadPool.QueueUserWorkItem (myCallback);
ThreadPool.QueueUserWorkItem (myCallback);
ThreadPool.QueueUserWorkItem (myCallback);
ThreadPool.QueueUserWorkItem (myCallback);
ThreadPool.QueueUserWorkItem (myCallback);
ThreadPool.QueueUserWorkItem (myCallback);
ThreadPool.QueueUserWorkItem (myCallback);
ThreadPool.QueueUserWorkItem (myCallback);
ThreadPool.QueueUserWorkItem (myCallback);
ThreadPool.QueueUserWorkItem (myCallback);
ThreadPool.QueueUserWorkItem (myCallback);
}
private void tt(object a)
{
int i=0;
Mointer.Enter(this._iTest);
i=(int)_iTest;
_iTest++;
moniter.Exit(this._iTest);
while(true)
{
//省略显示i的代码
}
}
显示出来的i永远是某个固定值,要不是最小值,要不是线程数量最大值,但其他情况来看,确实有N个线程在执行,请问在线程池里该如何对全局变量进行同步?
另外,上面代码进行改动如下:
把void tt里的 Mointer.Enter(this._iTest);及 moniter.Exit(this._iTest);删除
在Button1_Click里修改如下
Mointer.Enter(this._iTest);
ThreadPool.QueueUserWorkItem (myCallback);
moniter.Exit(this._iTest); //这句直接出错
private object glock = 0;
private int _iTest = 0;
private void tt(object a)
{
int i = 0;
//不要修改显示的值了
Monitor.Enter(this.glock);
i = (int)_iTest;
_iTest++;
this.Invoke(new MethodInvoker(delegate()
{
//显示下
textBox1.AppendText(_iTest.ToString() + "\r\n");
}));
Monitor.Exit(this.glock);
}
private int _iTest = 0;
//...
private void tt(object a)
{
int i = Interlocked.Increment(ref _iTest);
while (true)
{
//省略显示i的代码
}
}
Mointer.Enter(this._iTest);
ThreadPool.QueueUserWorkItem (myCallback);
moniter.Exit(this._iTest); //这句直接出错
//这样是不可以的,同一个对象锁定不能嵌套的。
while(true)
{
//省略显示i的代码
//记得在这里面释放时间片,你的例子让我死机了一小段时间
Thread.Sleep(0);
}