方法一(部分老版本VS不支持)
所需头:
#include <thread>
例子:
void print(char Num)
{
while(true)
{
printf("ok%c\n",Num);
Sleep(200);
}
}
int main(void)
{
std::thread(print,'1').detach();
std::thread(print,'2').detach();//.detach()让对象和线程分离,这样对象被销毁,线程还能运行,否则易出错
while(true);//阻塞
return 0;
}
可以看到1,2交替输出
要线程通讯咋办?直接用全局变量最方便。
方法二(通用)
注意:在旧版的VS,如VC6中,没有thread头,那么就需要换另一种方法创建线程,也很简单,但是不能任意传递参数:
函数原型:
HANDLE WINAPI CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程安全相关的属性,常置为NULL
SIZE_T dwStackSize, // 新线程的初始化栈在大小,可设置为0
LPTHREAD_START_ROUTINE lpStartAddress, // 被线程执行的回调函数,也称为线程函数
LPVOID lpParameter, // 传入线程函数的参数,不需传递参数时为NULL
DWORD dwCreationFlags, // 控制线程创建的标志
LPDWORD lpThreadId // 传出参数,用于获得线程ID,如果为NULL则不返回线程ID
);
例子:
void function()
{
printf("hello");
}
int main()
{
// 创建线程
HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)function/* 函数名 */, 0, 0, NULL);
// 关闭线程(必要)
CloseHandle(hThread);
return 0;
}
这种方法传递参数不方便,所以如果要传递参数,建议使用全局变量。
写在函数前的 (LPTHREAD_START_ROUTINE) 一般来说都是要加上的,如果编译报错的话就把他删了。