to zb_china(已经离开):
比如这样:
for(i=0;i<100;i++)
{
....
AfxBeginThread(mythreadProc,(LPVOID)&myInfo);
....
}
如果这里的myInfo是全局变量的话,你在第i+1个的线程中改变了myInfo的值,对前面的i个线程就会产生影响。这当然是我所不希望的。
比如这样:
for(i=0;i<100;i++)
{
....
AfxBeginThread(mythreadProc,(LPVOID)&myInfo);
....
}
如果这里的myInfo是全局变量的话,你在第i+1个的线程中改变了myInfo的值,对前面的i个线程就会产生影响。这当然是我所不希望的。
WaitForMultiObject的参数可以是一个线程句炳的数组,不需要用其他的同步对象了。另外,TerminateThread,不光造成new的内存不释放,还有分配的其他系统资源也不会释放的。
threads[1] = CreateThread(...);
......WaitForMultiObject( 100, threads, TRUE, INFINITE);
你的WaitForMultiObjects(100, threads, TRUE, INFINITE); 确实能等到100个子线程都结束,但是问题是,用户要关闭一个进程,居然要等很长时间(如果该100个子线程非常慢的话),这是不可忍受的。
所以还是要给那100个线程发送一个同步事件(event),告诉它们,你们可以退出循环或者当前的过程,赶快返回。这样是否每一个工作者线程都需要一个同步HANDLE了呢?(这个EVENT HANDLE实际上是由主线程发送给工作者线程的),所以我想每一个工作者线程还是需要一个同步HANDLE的(那样的话,不就是说N个子线程需要N个同步HANDLE对象么?),不知道兄台有什么观点?请指教。
由于对线程计数的访问必须是互斥的(各个线程都会对其读写),你可以在每个线程对其加减操作时使用互斥对象(Mutex)来实现。结束标志不存在冲突问题(各个线程都是读,只有主线程写),没有必要使用额外的技术。
然后再WaitForMultiObjects。
比如如下:
....
for(i=0;i<N;i++)
{
.....
if(g_bQuit)
break;
....
}
也可以是:
....
for(i=0;i<N;i++)
{
.....
if(WaitForSingleObject(killEvent,0)==WAIT_OBJECT_0)
break;
}
这两种各有什么优缺点呢?另外,你们哪一个对线程池操作有研究,可以一起分析一下,如何?
一般是不会出错的。
void Doit()
{
struct Para para;
CreateThread(..., ¶);
}一定要:
void Doit()
{
struct Para * para ;
CreateThread(..., para);
}或者
struct Para para;
void Doit()
{
CreateThread(..., ¶);
}