vc++ 创办多线程

vc++ 创建多线程
做互斥的软件实现,要创建多个线程,于是编了下面这段程序。
问题:1.我想给线程编号,于是在createThread里传参,(PVOID)i 的写法不知道对不对
2.输出结果,显示的数量不对啊,一会6个一会7个,而且有重复

#include <stdio.h>
#include <windows.h>

DWORD WINAPI ThreadFun(PVOID pM)
{
int n = (int)pM;

printf("线程%d-------\n", n);

return 0;
}

int main()
{
const int THREAD_NUM = 5;

HANDLE handle[THREAD_NUM];

for (int i = 0; i < THREAD_NUM; i++)
handle[i] = (HANDLE)CreateThread(NULL, 0, ThreadFun, (PVOID)i, 0, NULL);

Sleep(1);   //问题:如果不休眠这1毫秒线程就无法创建,为什么?Sleep的具体含义也不太理解
return 0;
}

------解决方案--------------------
print是缓冲式的,而且不是原子的。printf(stderr,,,),应该还好,不过要看具体crt实现。

出现几遍,要看crt具体内部实现。程序看上去没问题。

一般多线程,如果讲究点。会有个栏杆锁和旗语,也就是在具体运行前锁住所有的这类线程。这样,你就不会出现多次的问题。然后,主线程根据根据旗语翻转锁,启动所有的线程。

线程从创建到执行routine是个不确定态。看上去你那个是vc环境,windows好多年没写了也不好给你个例子。
------解决方案--------------------
1.我想给线程编号,于是在createThread里传参,(PVOID)i 的写法不知道对不对
写(PVOID)&i比较好点,但也是有问题,前几天就有同样的帖子。
最好是在线程函数中用个静态变量比如 static int count = 0; 线程 int id = count++
2.输出结果,显示的数量不对啊,一会6个一会7个,而且有重复
是由于main函数结束,有些线程来不及创建,就被迫一起退出。
可以Sleep(5000) 5秒
更正确的做法是用waitformutipleobjects 函数等待线程的handle,这样main函数会安全等待全部线程退出,然后closehandle
3.线程中用printf是可以的,用cout反而不行,会搞乱。
------解决方案--------------------
看错,我还以为是7个线程。
这样看来 (PVOID)i是可行的,上次的帖子是(PVOID)&i出现了问题,线程ID重复。
至于你的为啥重复打印,不知道原因,我试过运行你的代码,没重复。