原文:
【问题】创建了10个线程,10个线程公用一个线程体,创建如下:
int t1=0,t2=1,t3=2,t4=3,t5=4,t6=5,t7=6,t8=7,t9=8,t10=9; int *one=&t1,*two=&t2,*three=&t3,*four=&t4,*five=&t5,*six=&t6,*seven=&t7,*eight=&t8,*nine=&t9,*ten=&t10;
thread[3]=CreateThread(NULL,0,processQueue,one,0,NULL);
thread[4]=CreateThread(NULL,0,processQueue,two,0,NULL);
thread[5]=CreateThread(NULL,0,processQueue,three,0,NULL);
thread[6]=CreateThread(NULL,0,processQueue,four,0,NULL);
thread[7]=CreateThread(NULL,0,processQueue,five,0,NULL);
thread[8]=CreateThread(NULL,0,processQueue,six,0,NULL);
thread[9]=CreateThread(NULL,0,processQueue,seven,0,NULL);
thread[10]=CreateThread(NULL,0,processQueue,eight,0,NULL);
thread[11]=CreateThread(NULL,0,processQueue,nine,0,NULL);
thread[12]=CreateThread(NULL,0,processQueue,ten,0,NULL);
DWORD WINAPI processQueue(LPVOID lp)
{
//注意,读队列的时候,一定要free空间。
int i=*((int *)lp);
printf(" %d\n",i);
return 0;
}
按照正常的思维来说,这个显示的结果应该是从0-9(当然顺序可能有变化),但是不明原因,显示的时候,本来应该调用10次,但是却会显示11,12,13 次等不稳定结果【比如:2 1 0 3 5 4 6 6 4 7 8 9】,就是因为这个问题,俺跟杨哥搞了整整一天,直接摸不着头脑,臻哥还有508的伙也是对它没辙……
记得以前见过,在使用windows类库的前提下,c语言提供了两种多线程的方法,一种是CreateThread,另外一种是_beginthreadex.不然就换一种方法吧。
于是跑到508借了一本c编程,仔细看了一下_beginthreadex函数,它说默认情况下vc++中的c/c++运行期库不支持该函数,因为标准c中运行期库是没有多线程的概念。所以,我们必须对vc进行设置。
project--setting->c/c++->的Category对应的组合框中选择Code Generation类别,从user run-time library组合狂中选择Multithreaded DLL就可以了。
posted on 2014-12-12 16:12 阅读( ...) 评论( ...)