线程通信链接:https://blog.csdn.net/lizhenwei0219/article/details/96145663
代码1:
//最简单的创建多线程实例
#include <stdio.h>
#include <windows.h>
//子线程函数
DWORD WINAPI ThreadFun(LPVOID pM)
{
printf("子线程的线程ID号为:%d\n子线程输出Hello World\n", GetCurrentThreadId());
return 0;
}
//主函数,所谓主函数其实就是主线程执行的函数。
int main()
{
printf("最简单的创建多线程实例\n");
HANDLE handle = CreateThread(NULL, 0, ThreadFun, NULL, 0, NULL);
/*第一个参数表示线程内核对象的安全属性 传入null表示使用默认设置
* 第二个参数:线程栈大小,0表示默认大小(1MB)
* 第三个参数:新线程所执行的线程函数地址,多个线程可以使用同一个函数地址
* 第4个参数:传给线程函数的参数
* 第5个参数:指定额外的标志来控制线程的创建,0表示线程创建后立即就可以进行调度
* 第6个参数:返回线程的ID号 传入null表示不需要返回该线程ID号
* 函数返回值:成功:新线程的句柄 失败:NULL
*/
WaitForSingleObject(handle, INFINITE);
/*
* 第一个参数为要等待的内核对象。
*第二个参数为最长等待的时间,以毫秒为单位,如传入5000就表示5秒,传入0就立即返回,传入INFINITE表示无限等待。
* 函数返回值:
*在指定的时间内对象被触发,函数返回WAIT_OBJECT_0。超过最长等待时间对象仍未被触发返回WAIT_TIMEOUT。传入参数有错误将返回WAIT_FAILED
*/
return 0;
}
结果:
最简单的创建多线程实例
子线程的线程ID号为:18180
子线程输出Hello World
线程之间的通信:
1.全局变量
通过全局变量通信,需要加关键字volatile
代码:
#include <stdio.h>
#include <windows.h>
//全局变量
volatile int signalNum = 0;
DWORD WINAPI threadFuncA(LPVOID lpParamter)
{
Sleep(2000);
if (0 == signalNum)
{
printf("signalNum not changed!\n");
}
else
{
printf("signalNum has changed!\n");
}
return 0;
}
DWORD WINAPI threadFuncB(LPVOID lpParamter)
{
signalNum = 2;
return 0;
}
int main()
{
HANDLE threadA = CreateThread(NULL, 0, threadFuncA, NULL, 0, NULL);
HANDLE threadB = CreateThread(NULL, 0, threadFuncB, NULL, 0, NULL);
WaitForSingleObject(threadA, INFINITE);
CloseHandle(threadA);//CloseHandle只是关闭了系统句柄,该线程还是可以正常的运行
CloseHandle(threadB);
return 0;
}
结果:
signalNum has changed!
2.互斥量
该例中因为两个线程中都加了锁,而先创建的是A线程,所以会先进入threadFuncA,执行完线程A的内容才会进入线程B。
代码:
#include <stdio.h>
#include <windows.h>
/*
通过互斥量实现线程间的同步,初始化为没有加锁的状态
*/
HANDLE mutex = CreateMutex(NULL, FALSE, NULL);
int a = 0;
DWORD WINAPI threadFuncA(LPVOID lpParamter)
{
//对互斥量加锁,如果已经加锁了则等待其解锁,等待时间为INFINITE(表示永久)
WaitForSingleObject(mutex, INFINITE);
/*
WaitForSingleObject(mutex, INFINITE);
这里可以做对共享资源的操作
ReleaseMutex(mutex);
*/
for (int j=0; j < 1000000; j++)
{
a = a + 1;
}
printf("threadFuncA lock mutex,please wait~~~~~~\n");
Sleep(5000);
printf("threadFuncA unlock mutex!!!!!!!!!!!!!!!!\n");
//互斥量解锁
ReleaseMutex(mutex);
return 0;
}
DWORD WINAPI threadFuncB(LPVOID lpParamter)
{
WaitForSingleObject(mutex, INFINITE);
for (int j=0; j < 1000000; j++)
{
a = a + 1;
}
printf("This is threadFuncB ~~~~~~\n");
ReleaseMutex(mutex);
return 0;
}
int main()
{
HANDLE threadA = CreateThread(NULL, 0, threadFuncA, NULL, 0, NULL);
HANDLE threadB = CreateThread(NULL, 0, threadFuncB, NULL, 0, NULL);
WaitForSingleObject(threadB, INFINITE);
printf("a=%d", a);
CloseHandle(threadA);//CloseHandle只是关闭了系统句柄,该线程还是可以正常的运行
CloseHandle(threadB);
return 0;
}
结果:
threadFuncA lock mutex,please wait~~~~~~
threadFuncA unlock mutex!!!!!!!!!!!!!!!!
This is threadFuncB ~~~~~~
a=2000000