DWORD WINAPI threadname(LPVOID lpParamter) // 函数名字可随意

{ /*

     这里填入你的代码

      */

       return 0L; }

线程函数模板,其中IpParameter可以看作是一个void类型的指针。

创建一个线程:HANDLE hThread = CreateThread(NULL, 0, threadname, NULL, 0, NULL);hThread为返回值,第四个参数为所需要传递的参数的地址。

记得加入system("pause"),大致原因猜测:上面语句只是创建线程,创建之后,代码就读到下一步,至于线程有没有启动就不知道了,如果下一步就是return 0 ,那么主函数就结束,这个线程也就没了。

示例代码:

#include<iostream>
#include<windows.h>

using namespace std;

// 编写了一个我的线程函数
DWORD WINAPI MyThread(LPVOID lpParamter)
{
cout << "fuck the multithread !\n";
return 0L;
}

int main ()
{
// 创造线程
CreateThread(NULL, 0, MyThread, NULL, 0, NULL);
// 记得等待线程结束
system("PAUSE");
return 0;
}

void类型指针:int a = 0; int *intp = &a; // int指针 转 void指针 void * voidp = intp;

intp = voidp; // 不合法! void* 指针不能直接赋值给 int*指针,会报错!

intp = (int *)voidp// 合法!利用强制类型转换,告诉编译器,voidp指针指向的是int数据。

有参数的线程用法:

DWORD WINAPI MyThread(LPVOID lpParamter)
{
// 把lpParamter当成void指针就完事儿了
int *a = (int *)lpParamter;
cout << "I have " << a[0] << " dolors!\n";
return 0L;
}

int main ()
{
int a = 0;
int *p = &a;
// 创造线程,注意我把p指针作为参数传入了,它也就成为了上方函数的lpParamter
CreateThread(NULL, 0, MyThread, p, 0, NULL);
// 记得等待线程结束
system("PAUSE");
return 0;
}

等待某个线程结束:

HANDLE hThread = CreateThread(NULL, 0, thread1, NULL, 0, NULL);
// 利用得到的句柄等待线程结束
WaitForSingleObject(hThread, INFINITE);

这就是等待线程hThread执行完再走下一步。

锁的用法:

// 声明一个句柄
HANDLE cout_mutex;
// 创建一个锁
cout_mutex = CreateMutex(NULL, FALSE, NULL);推测false是一个初值,意思是开始还没有线程使用。

// 等待其它线程释放锁,并获取锁的使用权
WaitForSingleObject(cout_mutex, INFINITE);

// 获取锁之后,只要没有解锁,其它线程就会阻塞在WaitForSingleObject()语句。
做一些工作(使用需要互斥的资源等)///////////////////////////////////////例如是某个线程函数内部实现代码

// 解锁!
ReleaseMutex(cout_mutex);

待续..........以上内容转自:https://blog.csdn.net/Kprogram/article/details/89472995