【C语言】Windows下的多线程编程-信号量

这篇博客介绍了信号量在多线程编程中的作用,通过CreateSemaphore、OpenSemaphore、ReleaseSemaphore和CloseHandle四个函数展示了如何创建、打开、释放和销毁信号量。示例中,线程1和线程2通过信号量实现交替执行,确保资源的有序访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

信号量主要将用到四个函数。下面是这些函数的原型和使用说明。

CreateMutex创建互斥量

/** \brief 	创建一个信号量
 *
 * \param   lpSemaphoreAttributes 表示安全控制,一般直接传入NULL。
 * \param   lInitialCount 设置信号量的初始计数。可设置零到lMaximumCount之间的一个值
 * \param   lMaximumCount 设置信号量的最大计数
 * \param   lpName 指向信号量对象名的指针
 * \return  成功,就返回信号量对象的句柄;0表示出错
 *
 */
HANDLE CreateSemaphore(
	LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
	LONG lInitialCount,
	LONG lMaximumCount,
	LPCTSTR lpName
);

OpenMutex打开互斥量

/** \brief 	打开信号量
 *
 * \param   dwDesiredAccess 表示访问权限,对互斥量一般传入SEMAPHORE_ALL_ACCESS。
 * \param   bInheritHandle 表示信号量句柄继承性,一般传入TRUE即可
 * \param   lpName 指向信号量对象名的指针
 * \return  成功返回一个表示信号量的句柄,失败返回NULL
 *
 */
HANDLE OpenSemaphore(
	DWORD dwDesiredAccess,
	BOOL bInheritHandle,
	LPCTSTR lpName
);

ReleaseMutex触发互斥量

/** \brief 	对指定的信号量增加指定的值
 *
 * \param   hSemaphore 所要操作的信号量对象的句柄,这个句柄是CreateSemaphore或者OpenSemaphore函数的返回值
 * \param   lReleaseCount 表示增加个数,必须大于0且不超过最大资源数量
 * \param   lpPreviousCount 指向返回信号量上次值的变量的指针,如果不需要信号量上次的值,那么这个参数可以设置为NULL
 * \return  如果成功返回TRUE,如果失败返回FALSE
 *
 */
BOOL ReleaseSemaphore(
	HANDLE hSemaphore,
	LONG lReleaseCount,
	LPLONG lpPreviousCount
);

CloseHandle销毁信号量

由于信号量是内核对象,因此使用CloseHandle()就可以(这一点所有内核对象都一样)

/** \brief 	关闭一个内核对象
 *
 * \param   hObject 代表一个已打开对象handle。
 * \return  TRUE:执行成功;FALSE:执行失败,可以调用GetLastError()获知失败原因。
 *
 */
BOOL CloseHandle(HANDLE hObject);

示例

线程1与线程2依次进行

#include <stdio.h>
#include <Windows.h>
#include <process.h>


void Thread1(void*);
void Thread2(void*);


/* 线程句柄 */
HANDLE h1, h2;

/* 信号量句柄 */
HANDLE hs1, hs2;

/* 主线程 */
int main()
{
	/* 创建信号量 */
	hs1 = CreateSemaphore(NULL, 1, 1, NULL);
	hs2 = CreateSemaphore(NULL, 0, 1, NULL);

	/* 创建线程 */
	h1 = (HANDLE)_beginthread(Thread1, 0, NULL);//线程1
	h2 = (HANDLE)_beginthread(Thread2, 0, NULL);//线程2

	WaitForSingleObject(h1, INFINITE);

	return 0;
}


/* 线程1 */
void Thread1(void* arg)
{
	while (1)
	{
		/* 等待信号量1 最大等待时间为无穷 */
		WaitForSingleObject(hs1, INFINITE);

		printf("Thread111111\n");
		Sleep(100);

		/* 释放信号量2 */
		ReleaseSemaphore(hs2, 1, NULL);
	}
}


/* 线程2 */
void Thread2(void* arg)
{
	while (1)
	{
		/* 等待信号量2 最大等待时间为无穷 */
		WaitForSingleObject(hs2, INFINITE);

		printf("Thread222222\n");
		Sleep(100);

		/* 释放信号量1 */
		ReleaseSemaphore(hs1, 1, NULL);
	}
}

输出结果
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值