CreateMutex WaitForSingleObject ReleaseMutex使用

HANDLE CreateMutex(

 LPSECURITY_ATTRIBUTES lpMutexAttributes,//

 BOOL bInitialOwner,  // flag for initial ownership

 LPCTSTR lpName     // pointer to mutex-object name

 );

参数2:指示互斥对象的初始拥有者。 如果该值是真,调用者创建互斥对象,调用的线程获得互斥对象的所有权。 否则,不拥有所有权,此时互斥对象处于空闲状态,其他线程可以占用。

(-)  主线程中创建拥有所有权的互斥量,两个子线程中分别等待互斥量-》没有输出

DWORD WINAPI ThreadProc1(LPVOID lpParameter);
DWORD WINAPI ThreadProc2(LPVOID lpParameter);

int    ticket = 50;
HANDLE hMutex = NULL;

int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE handle1 = CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
	HANDLE handle2 = CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);

	CloseHandle(handle1);
	CloseHandle(handle2);

	hMutex = CreateMutex(NULL,TRUE,NULL); //第二个参数为TRUE,互斥对象的所有权为主线程所有,非空闲状态

	Sleep(4000);

	return 0;
}

DWORD WINAPI ThreadProc1(LPVOID lpPar
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个典型的生产者消费者模型问题。以下是一个用水果的例子模拟生产者消费者模型的示例代码: ```c++ #include <iostream> #include <windows.h> #include <cstdlib> #include <ctime> #include <string> using namespace std; const int BUFFER_SIZE = 5; // 缓冲区大小 string buffer[BUFFER_SIZE]; // 缓冲区数组 int in = 0; // 缓冲区的写指针 int out = 0; // 缓冲区的读指针 HANDLE hMutex; // 互斥锁句柄 HANDLE hEmpty; // 空缓冲区信号量句柄 HANDLE hFull; // 满缓冲区信号量句柄 string fruits[7] = {"Apple","Banana","Cherry","Orange","Pear","Peach","WaterMelon"}; // 生产者线程函数 DWORD WINAPI Producer(LPVOID lpParam) { while (true) { // 随机生产一个水果 string fruit = fruits[rand() % 7]; // 等待空缓冲区 WaitForSingleObject(hEmpty, INFINITE); // 等待互斥锁 WaitForSingleObject(hMutex, INFINITE); // 将水果放入缓冲区 buffer[in] = fruit; in = (in + 1) % BUFFER_SIZE; cout << "Producer produced " << fruit << endl; // 释放互斥锁 ReleaseMutex(hMutex); // 发送满缓冲区信号 ReleaseSemaphore(hFull, 1, NULL); // 等待一定时间再生产下一个水果 Sleep(rand() % 3000 + 1000); } return 0; } // 消费者线程函数 DWORD WINAPI Consumer(LPVOID lpParam) { while (true) { // 等待满缓冲区 WaitForSingleObject(hFull, INFINITE); // 等待互斥锁 WaitForSingleObject(hMutex, INFINITE); // 从缓冲区取出一个水果 string fruit = buffer[out]; out = (out + 1) % BUFFER_SIZE; cout << "Consumer consumed " << fruit << endl; // 释放互斥锁 ReleaseMutex(hMutex); // 发送空缓冲区信号 ReleaseSemaphore(hEmpty, 1, NULL); // 等待一定时间再消费下一个水果 Sleep(rand() % 3000 + 1000); } return 0; } int main() { // 初始化随机数种子 srand(time(NULL)); // 创建互斥锁和信号量 hMutex = CreateMutex(NULL, FALSE, NULL); hEmpty = CreateSemaphore(NULL, BUFFER_SIZE, BUFFER_SIZE, NULL); hFull = CreateSemaphore(NULL, 0, BUFFER_SIZE, NULL); // 创建生产者和消费者线程 HANDLE hProducer = CreateThread(NULL, 0, Producer, NULL, 0, NULL); HANDLE hConsumer = CreateThread(NULL, 0, Consumer, NULL, 0, NULL); // 等待线程结束 WaitForSingleObject(hProducer, INFINITE); WaitForSingleObject(hConsumer, INFINITE); // 关闭句柄 CloseHandle(hMutex); CloseHandle(hEmpty); CloseHandle(hFull); return 0; } ``` 在这个例子中,我们使用了三个句柄分别表示互斥锁、空缓冲区信号量和满缓冲区信号量。生产者线程随机生产一个水果,并将其放入缓冲区中,然后发送满缓冲区信号。消费者线程从缓冲区中取出一个水果,并发送空缓冲区信号。如果缓冲区已满,生产者线程会等待满缓冲区信号;如果缓冲区为空,消费者线程会等待空缓冲区信号。在访问缓冲区时,我们使用互斥锁来保证线程安全。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值