线程的问题????????

zdz86 2009-05-04 03:41:14
#include "stdafx.h"
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

DWORD WINAPI ThreadFunc(LPVOID);

int main()
{
HANDLE hThrd;
DWORD threadId;
int i;

for (i = 0; i < 5; i++)
{
hThrd = CreateThread(NULL, 0, ThreadFunc, (LPVOID)i, 0, &threadId);
if (hThrd)
{
printf("Thread launched %d\n", i);
CloseHandle(hThrd);
}
}
// Wait for the threads to complete.
Sleep(5000);

return EXIT_SUCCESS;
}

DWORD WINAPI ThreadFunc(LPVOID n)
{
int i;
for (i = 0; i < 10; i++)
printf("%d%d%d%d%d%d%d%d\n", n, n, n, n, n, n, n, n);
return 0;
}


这程序大至的流程图是怎么样的?我没看明白线程到底是怎么一回事。
...全文
78 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zdz86 2009-05-04
  • 打赏
  • 举报
回复
恩,谢谢Jinhao,我明白了。
Jinhao 2009-05-04
  • 打赏
  • 举报
回复
>>为什么出现两次一样的结果?
导致这样的结果和输出11个1和12个13是一样的。因为printf并不是线程安全的,导致多个线程同时调用printf而引发的问题。例如,线程A正好输出完毕,在清空缓冲区之前,操作系统就把该线程挂起,切换到另外一个线程B,而线程B正好调用printf,就把输出的文本信息添加到缓冲区中,导致重复输出线程A输出的文本。
zdz86 2009-05-04
  • 打赏
  • 举报
回复
有一次的运行结果是这样的(部分):

Thread launched 0
Thread launched 1//
Thread launched 1//1、为什么出现两次一样的结果?
00000000
0011111111//2、????
11111111
00000
11111111
00000
Thread launched 2
11111111
00000000
11111111
11111111
Thread launched 3
11111111
Thread launched 3
22222222
00000000
11111111
Thread launched 4
Thread launched 4
33333333
22222222
00000000
11111111
33333333
22222222
…………
Jinhao 2009-05-04
  • 打赏
  • 举报
回复
>>每次执行完这句程序就从主函数分出一条支线去执行ThreadFunc()?

在Windows上,是开启一条执行线程去执行ThreadFunc

>>CloseHandle(hThrd);
关闭CreateThread创建的句柄,并不会关闭线程对象。

上面1输出11行,3输出12行,是因为printf不是线程安全的。至于输出的顺序,2很有可能输出在4的后面,因为操作系统线程调度的问题。
zdz86 2009-05-04
  • 打赏
  • 举报
回复
hThrd = CreateThread(NULL, 0, ThreadFunc, (LPVOID)i, 0, &threadId);

每次执行完这句程序就从主函数分出一条支线去执行ThreadFunc()?

但它的后面一句
 CloseHandle(hThrd);
又是做什么用的呢?
zdz86 2009-05-04
  • 打赏
  • 举报
回复
不是手写的,复制上来的
Jinhao 2009-05-04
  • 打赏
  • 举报
回复
不过你那个结果应该有问题。每一种数字不会超过10行,你那输出1就11行了。你自己手写的?
至于顺序,是不能确定的,可能会先输出0,也可能会先输出4
zdz86 2009-05-04
  • 打赏
  • 举报
回复
Thread launched 0
Thread launched 1
Thread launched 2
11111111
11111111
11111111
Thread launched 3
11111111
11111111
11111111
11111111
11111111
11111111
11111111
11111111
33333333
33333333
33333333
33333333
33333333
33333333
33333333
33333333
33333333
00000000
33333333
33333333
22222222
00000000
33333333
33333333
44444444
22222222
00000000
44444444
22222222
00000000
44444444
22222222
00000000
44444444
22222222
00000000
44444444
22222222
00000000
44444444
22222222
00000000
44444444
22222222
00000000
44444444
22222222
00000000
44444444
22222222
44444444
结果怎么会是这样。。。没有明白

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧