类似以下代码
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 _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); //这句直接出错
{
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);
}
while(true)
{
//省略显示i的代码 //记得在这里面释放时间片,你的例子让我死机了一小段时间
Thread.Sleep(0);
}
Mointer.Enter(this._iTest);
ThreadPool.QueueUserWorkItem (myCallback);
moniter.Exit(this._iTest); //这句直接出错//这样是不可以的,同一个对象锁定不能嵌套的。
private int _iTest = 0;
//...
private void tt(object a)
{
int i = Interlocked.Increment(ref _iTest);
while (true)
{
//省略显示i的代码
}
}
谢谢你,Interlocked.Increment只能对int或者long变量进行原子锁递增。可以满足本例
请问如何在线程池的线程间同步所有变量,而不仅于long或者int变量如果50分不够解决这个问题可以加分。