windows多线程以及线程之间的通信

线程通信链接: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
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值