我说我叫CreateMutex。
HANDLE h;
h=CreateMutex(NULL, TRUE, NULL);
waitforsingleobject(h, INFINITE);
////Random Code
ReleaseMutex(h);
假设我有多个线程正在运行,那么到达函数createmutex的第一个线程实际上会阻塞//随机代码部分中的所有其他线程,直到释放mutex被调用为止?
答案 0 :(得分:14)
它没有,因为您创建了一个未命名的互斥锁(第三个参数是名称)。假设示例代码在多个线程中运行,每个线程将创建一个新的未命名互斥锁,并将立即访问关键部分(随机代码),因为它们只等待自己的互斥锁。
要解决此问题,要么让h成为所有线程都可以访问的全局句柄,并在共享代码之外调用CreateMutex,或者为CreateMutex提供名称(第三个参数)。在后一种情况下,后续调用CreateMutex将返回现有互斥锁的句柄。
答案 1 :(得分:1)
由于您没有为互斥锁指定名称,因此每个线程都会创建自己独特的互斥锁,其他线程将无法识别。
在您的方案中,关键部分将是更好的选择。
答案 2 :(得分:1)
考虑到您创建了一个未命名的互斥锁,每个线程都会创建一个自己的未命名互斥锁,并在创建时承担所有权。由于每个线程都有自己的互斥锁,因此所有线程都可以并行运行。
因此,如果您希望将其命名为未命名,则应为所有线程创建一次互斥锁。从查看代码开始,您还应该检查互斥锁创建是否成功。
然后在从多个线程调用的函数中,在先前创建的互斥锁上调用WaitForSingleObject。
检查返回的结果是否返回,因为您获得了互斥锁的所有者或等待因为互斥锁被放弃而终止。
如果您拥有所有权,请确保在互斥锁手柄上调用ReleaseMutex。可能您应该考虑使用RAII来管理互斥锁,原因有多种(确保在发生异常时或在ReleaseMutex之前插入return语句时正确释放互斥锁,仅举几例)。
有时不再需要互斥锁时,请确保在MutexHandle上调用CloseHandle。
有关如何使用互斥锁的示例,请参阅此处:"Using Mutex Objects"
对于基本的多线程包装,请参见此处:Using Threads
答案 3 :(得分:0)
仅当所有线程/进程共享相同的互斥引用时。你没有分享它,你每次都在创造它。您需要对其进行命名,以便它们都能获得相同的互斥锁,以便您的代码能够正常工作。