c语言windows下写多线程的问题

以下是我的测试代码:
#include <process.h>
#include <stdio.h>
#include <windows.h>
void thread_proc(void *arg)
{
printf("I am thread %d,my id is:",arg);
_endthread();
}
int main()
{
unsigned pid;
int count=0;

while(count<5)
{
_beginthreadex(NULL,0, (unsigned (__stdcall *) (void *))thread_proc,(void *)count,0,&pid);
Sleep( 10);
printf("%d\n",pid);
count++;
}
return 0;
}
我的问题是:
倘若没有Sleep(10)的时候,打印结果如下:

1776
204
3840
I am thread 0,my id is:I am thread 1,my id is:I am thread 2,my id is:3104
3528
请按任意键继续. . .

而有Sleep(10)的时候,打印结果如下:

I am thread 0,my id is:3544
I am thread 1,my id is:256
I am thread 2,my id is:1728
I am thread 3,my id is:2824
I am thread 4,my id is:2620
请按任意键继续. . .

这是怎么回事呢?难道与线程间同步与互斥有关???

因为你没有加同步互斥机制,所以如果没有足够的sleep的话,线程函数和main函数里的printf("%d\n",pid);之间的顺序是未知的,视你的系统环境而定。比如我运行了几次,结果都不一样,有时候是只输出5个随机数,有时候和你的结果一样。如果加了足够的sleep,那么就可以确保在执行printf("%d\n",pid);
前,线程函数已经结束了,那么就不会出现混乱的结果了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-08-11
printf("I am thread %d,my id is:",arg);

难道不是 printf("I am thread %d,my id is:",*arg);

unsigned pid;
第2个回答  2009-08-11
与操作系统的调度有关,举一个最简单的例子,比如说调度时间限是1000,而开始_beginthreadex时还剩800,_beginthreadex用掉200还剩600,因为被创建线程调度优先级与创建线程相同,所以这时还是创建线程在执行(未发生调度),printf函数较快用掉50,还剩550,按这种规律发展的话时限是:800,600,(打印pid),550,350,(打印pid),300,100,(打印pid), 50,0,为0时主线程在_beginthreadex中,这时发生调度执行另外一线程才打印了i am thread。 而Sleep是告诉系统进入等待主动放弃了时限,所以立即调度其他线程。本例中数字是虚数,只表示了相对大小。

c语言windows下写多线程的问题
因为你没有加同步互斥机制,所以如果没有足够的sleep的话,线程函数和main函数里的printf("%d\\n",pid);之间的顺序是未知的,视你的系统环境而定。比如我运行了几次,结果都不一样,有时候是只输出5个随机数,有时候和你的结果一样。如果加了足够的sleep,那么就可以确保在执行printf("%d\\n",pid)...

Windows下C语言多线程实现UDP通信程序recvfrom()函数出现10054错误:远程...
在进行Windows下C语言多线程实现UDP通信程序时,遇到recvfrom()函数出现10054错误的情况。问题在于将recvfrom函数置于一路线程中,而sendto函数置于主线程中。此错误被发现源于Windows socket的一个bug,在UDP Socket发送数据后收到不可达ICMP包时,此错误会在下一次接收时返回,导致recvfrom()函数返回SOCKET...

请问用C语言在windows上建立多线程需要用什么函数最好,
\/\/本程序允许的生产和消费线程的总数;#define MAX_THREAD_NUM 64\/\/定义一个结构,记录在测试文件中指定的每一个线程的参数struct ThreadInfo{ int serial; \/\/线程序列号 char entity; \/\/是P还是C double delay; \/\/线程延迟 int thread_request[MAX_THREAD_NUM]; \/\/线程请求队列 int n_request; \/\/请求个数...

请教关于C语言的多线程问题
这是有可能当主线程(即main函数)执行完后,新创建的线程还没来得及执行,所以应该使主线程先暂停,即使用Sleep()函数 include <windows.h> include <stdio.h> char testdir[100];DWORD WINAPI Fun1( LPVOID lpParameter ){ strcpy(testdir,"this is a test dir");MessageBox(NULL,testdir,"...

用C语言如何实现多线程同时运行的情况下,各个线程输出不同的随机数?
1、使用pthread库执行多线程,这个是Linux下的线程库 Windows下应该有自己的API,不过这种东西一般还是以Linux为标准。pthread_create()创建一个线程,传入fun()的函数指针就行了。然后这个Beep()的需求要进行线程间通信,可以用共享内存的方法,设一个bool变量flag共享,然后beep的时候设为false,beep完设成true。fun()...

请教关于windows下C语言线程的问题,就是如何处理一个服务器接收多个客户...
结束指定线程 BOOL TerminateThread(HANDLE hThread, \/\/ handle to thread DWORD dwExitCode \/\/ exit code );结束函数所在的线程 VOID ExitThread(DWORD dwExitCode \/\/ exit code for this thread );2.4 关闭线程句柄 CloseHandle LZ用fork()那不是多线程,是多进程了,你这个不需要多进程的...

windows环境,多线程情况下,C语言向文件写入数据。
数据结构:下面其他理论的基础。操作系统原理:理解操作系统的架构和细节,你才能对以后关于多线程、文件管理、内存管理、指令优先级等有一个正确理解和运用。编译原理:能够升华你对计算机编程语言的理解,对以后出现的各种编译、解释、兼容、移植、优化、并发与并行算法等有一个深入理解。数据库系统原理:...

C语言如何实现多线程同时运行
要实现C语言的多线程同时运行,首先打开项目设置。在菜单栏中选择"Project"选项,向下拉选择"Project options...",这是对项目属性进行配置的地方。接下来,进入对话框并切换到"Compiler"选项卡。在这里,重要一步是更改"Runtime Library"设置,将其更改为"Multithreaded (LIB)",这有助于支持多线程编程...

C语言多线程问题:如何让下面两段代码同时运行 就是播放生日歌的同时输...
,"七","八","九","十"};for(i=0;i<10;i++){ printf("%s",a[i]);Sleep(500);} } int main(){ _beginthread(MyPlaySound, 0, NULL);_beginthread(MyPrint, 0, NULL);Sleep(20000);return 0;} 编译之前记得把项目属性里改成多线程方案的.不然会出错.我是在VS2010下编译的.

[高分,急]C语言,如何实现多线程,有具体方案,请提供!
你这个问题可是超过200分的啊,这个往大了说是一个比较复杂的设计方案。实际上C语言是没有多线程的概念的,但是我们可以通过Task来实现多任务。简单的说,可以采取以下方案:定义一个主Task,将其置为常驻Task,用以进行Task调度和Task的启动\/终了和交互的管理。定义一个Task优先级列表,用优先级来作为...

相似回答