huidong

首页 | 会员登录 | 关于争取 2022 寒假做出汇东网 Ver3.0.0 !
搜索文章


方法一(部分老版本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)  一般来说都是要加上的,如果编译报错的话就把他删了。






返回首页


Copyright (C) 2018-2022 huidong