C++中Semaphore内核对象用法实例
什么是Semaphore对象
Semaphore是一种同步内核对象,用于实现线程或进程之间的同步与互斥。它可以用来限制同时进行某项操作的线程或进程的数量。可以把Semaphore视为一个许可证表。在多任务操作系统中,如果操作系统中有多个线程或进程需要访问共享资源,那么当这些线程或进程数目超过一定限制时,就会发生资源竞争的情况,为了避免这种情况的发生,可以使用Semaphore对象进行同步控制和协调。
Semaphore对象具有两个标准操作:
- Wait():如果许可证表中没有许可证可用,则线程或进程被挂起并等待可用的许可证。否则,从许可证表中取出一个许可证,并继续执行。
- Signal():向许可证表中添加一个许可证,如果有被挂起的线程或进程在等待许可证,那么它们中的一个将被唤醒并收到许可证,否则,许可证将保留在许可证表中,等待下一次被取用。
Semaphore对象通常初始化为一个大于或等于零的整数,表示初始时许可证表中可用的许可证数量。如果Semaphore对象的计数器为0,则所有的Wait操作都会被阻塞,直到调用Signal操作为止。
Semaphore对象的使用方法
Semaphore对象通常包括以下步骤:
1. 创建Semaphore对象:使用CreateSemaphore函数创建一个Semaphore对象,指定其初始计数器、最大计数器、名称等参数。
2. Wait操作:使用WaitForSingleObject或WaitForMultipleObjects函数进行等待操作。
3. Signal操作:使用ReleaseSemaphore函数对Semaphore对象进行信号操作。
4. 关闭Semaphore对象:使用CloseHandle函数关闭Semaphore对象。
下面的示例展示了Semaphore对象的使用方法:
示例一
#include <Windows.h>
#include <iostream>
using namespace std;
int main() {
HANDLE hSemaphore;
DWORD dwWaitResult;
// 创建Semaphore对象
hSemaphore = CreateSemaphore(NULL, 1, 1, "MySemaphore");
if (hSemaphore == NULL) {
cout << "CreateSemaphore error: " << GetLastError() << endl;
return 1;
}
// Wait操作
dwWaitResult = WaitForSingleObject(hSemaphore, 5000);
switch (dwWaitResult) {
case WAIT_OBJECT_0:
// 获取Semaphore对象成功
cout << "获取Semaphore对象成功" << endl;
break;
case WAIT_TIMEOUT:
// 超时
cout << "等待获取Semaphore对象超时" << endl;
break;
default:
// 错误
cout << "WaitForSingleObject error: " << GetLastError() << endl;
return 1;
}
// Signal操作
if (!ReleaseSemaphore(hSemaphore, 1, NULL)) {
cout << "ReleaseSemaphore error: " << GetLastError() << endl;
return 1;
}
// 关闭Semaphore对象
CloseHandle(hSemaphore);
return 0;
}
代码中,使用CreateSemaphore函数创建了一个名为"MySemaphore"的Semaphore对象,其初始计数器和最大计数器都为1。使用WaitForSingleObject函数等待Semaphore对象,等待的时间为5秒,如果等待到了可用的许可证,则输出"获取Semaphore对象成功",调用ReleaseSemaphore函数对Semaphore对象进行Signal操作,并最后关闭Semaphore对象。
示例二
#include <Windows.h>
#include <iostream>
#include <vector>
#include <thread>
using namespace std;
HANDLE hSemaphore;
const int nThreadCount = 3;
vector<thread> vecThreads;
void ThreadProc(int nIndex) {
DWORD dwWaitResult;
dwWaitResult = WaitForSingleObject(hSemaphore, INFINITE);
switch (dwWaitResult) {
case WAIT_OBJECT_0:
// 获取Semaphore对象成功
cout << "线程[" << nIndex << "]获取Semaphore对象成功" << endl;
Sleep(2000);
break;
default:
// 错误
cout << "WaitForSingleObject error: " << GetLastError() << endl;
}
ReleaseSemaphore(hSemaphore, 1, NULL);
return;
}
int main() {
int i;
// 创建Semaphore对象
hSemaphore = CreateSemaphore(NULL, 2, 2, "MySemaphore");
if (hSemaphore == NULL) {
cout << "CreateSemaphore error: " << GetLastError() << endl;
return 1;
}
// 创建线程
for (i = 0; i < nThreadCount; i++) {
vecThreads.emplace_back(ThreadProc, i);
}
// 等待线程执行完成
for (auto& thread: vecThreads) {
thread.join();
}
// 关闭Semaphore对象
CloseHandle(hSemaphore);
return 0;
}
代码中,使用CreateSemaphore函数创建了一个名为"MySemaphore"的Semaphore对象,其初始计数器和最大计数器都为2。使用CreateThread函数创建了3个线程,线程函数为ThreadProc,该函数等待Semaphore对象,等待时间为无限,如果等待到了可用的许可证,则输出"线程[i]获取Semaphore对象成功",延迟2秒,并调用ReleaseSemaphore函数对Semaphore对象进行Signal操作。最后关闭Semaphore对象。
以上两个示例展示了常规的Semaphore对象使用方法,通过Semaphore对象可以实现线程同步控制和协调等功能,在实际的应用开发中,Semaphore对象的应用非常广泛。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中Semaphore内核对象用法实例 - Python技术站