互斥对象使用CreateMutex

原创 2014年08月21日 15:33:01

msdn上对CreateMutex的说明是

CreateMutex function

Creates or opens a named or unnamed mutex object.

To specify an access mask for the object, use the CreateMutexEx function.

Syntax

HANDLE WINAPI CreateMutex(
  _In_opt_  LPSECURITY_ATTRIBUTES lpMutexAttributes,
  _In_      BOOL bInitialOwner,
  _In_opt_  LPCTSTR lpName
);

Parameters

lpMutexAttributes [in, optional]

A pointer to a SECURITY_ATTRIBUTES structure. If this parameter is NULL, the handle cannot be inherited by child processes.

The lpSecurityDescriptor member of the structure specifies a security descriptor for the new mutex. If lpMutexAttributes is NULL, the mutex gets a default security descriptor. The ACLs in the default security descriptor for a mutex come from the primary or impersonation token of the creator. For more information, see Synchronization Object Security and Access Rights.

bInitialOwner [in]

If this value is TRUE and the caller created the mutex, the calling thread obtains initial ownership of the mutex object. Otherwise, the calling thread does not obtain ownership of the mutex. To determine if the caller created the mutex, see the Return Values section.

lpName [in, optional]

The name of the mutex object. The name is limited to MAX_PATH characters. Name comparison is case sensitive.

If lpName matches the name of an existing named mutex object, this function requests the MUTEX_ALL_ACCESS access right. In this case, the bInitialOwner parameter is ignored because it has already been set by the creating process. If the lpMutexAttributesparameter is not NULL, it determines whether the handle can be inherited, but its security-descriptor member is ignored.

If lpName is NULL, the mutex object is created without a name.

If lpName matches the name of an existing event, semaphore, waitable timer, job, or file-mapping object, the function fails and the GetLastError function returnsERROR_INVALID_HANDLE. This occurs because these objects share the same namespace.

The name can have a "Global\" or "Local\" prefix to explicitly create the object in the global or session namespace. The remainder of the name can contain any character except the backslash character (\). For more information, see Kernel Object Namespaces. Fast user switching is implemented using Terminal Services sessions. Kernel object names must follow the guidelines outlined for Terminal Services so that applications can support multiple users.

The object can be created in a private namespace. For more information, see Object Namespaces.

Return value

If the function succeeds, the return value is a handle to the newly created mutex object.

If the function fails, the return value is NULL. To get extended error information, callGetLastError.

If the mutex is a named mutex and the object existed before this function call, the return value is a handle to the existing object, GetLastError returns ERROR_ALREADY_EXISTSbInitialOwneris ignored, and the calling thread is not granted ownership. However, if the caller has limited access rights, the function will fail with ERROR_ACCESS_DENIED and the caller should use theOpenMutex function.

互斥对象CreateMutex(NULL,FALSE,"");第一个参数如果为NULL,表示子进程无法继承这个互斥对象,第二个参数为false表示互斥对象初始化后不会默认被创建进程占有,第三个参数表示互斥对象的名字。

互斥对象一旦被线程占有,则其他的线程无法再获取互斥对象而处于阻塞状态,只有占有线程通过ReleaseMutex释放互斥对象,其他线程才能够获取互斥对象,这样可以防止线程对数据的交叉访问而产生的错误。


#include <iostream>

#include <afx.h>
#include <process.h>
using namespace std;
HANDLE hUp;
CRITICAL_SECTION g_data;
int arr[10];
HANDLE hMutex; 
UINT __stdcall Add(LPVOID lParam)
{
    DWORD dReturn = WaitForSingleObject(hMutex,INFINITE);
    for (int i = 0; i<10;i++ )
    {
       arr[i]=i;//0-9
    }
    for ( i = 0;i < 10; i++)
    {
       cout<<arr[i]<<" ";
    }
    cout<<endl;
    ReleaseMutex(hMutex);
    return 1;
}
UINT __stdcall Add2(LPVOID lParam)
{
    DWORD dReturn = WaitForSingleObject(hMutex,INFINITE);
    for (int i = 0; i<10 ;i++)
    {
       arr [i] = i+100;//10`1
    }
    for ( i = 0;i < 10; i++)
    {
       cout<<arr[i]<<" ";
    }
    cout<<endl;
    ReleaseMutex(hMutex);
    return 1;
}
int main()
{
    hMutex = CreateMutex(NULL,FALSE,"");
    hUp=(HANDLE)_beginthreadex(NULL, 0, Add2, NULL, NULL, 0);
hUp=(HANDLE)_beginthreadex(NULL, 0, Add, NULL, NULL, 0);//线程创建之后是立即执行的,也不会阻塞。

    Sleep(5000);

}

output:


CreateMutex创建互斥体

进程的互斥运行   正常情况下,一个进程的运行一般是不会影响到其他正在运行的进程的。但是对于某些有特殊要求的如以独占方式使用串行口等硬件设备的程序就要求在其进程运行期间不允许其他试图使用此端口设...
  • yuanmeng567
  • yuanmeng567
  • 2013年12月25日 13:41
  • 2141

线程同步 互斥量 Mutex 内核对象 CreateMutex

CreateMutex ReleaseMutex 互斥量:确保一个线程独占对一个资源的访问。(与关键代码段行为完全相同,只是互斥量属于内核对象,关键代码段属于用户模式下的同步对象) 互斥量包含一个使用...
  • w280683395
  • w280683395
  • 2015年11月09日 13:51
  • 953

CreateMutex创建互斥内核对象

http://blog.sina.com.cn/s/blog_149e9d2ec0102wyr0.html 在编程中我们常使用程序创建一个互斥的内核对象,目的就是为了让这个程序只能运行一次。我们...
  • stf1065716904
  • stf1065716904
  • 2017年06月23日 17:10
  • 134

Windows进程同步之互斥量内核对象(Mutex)

我们知道进程间的同步操作都是要借助内核来完成的,和同一个进程中的线程同步只需要在用户模式下是有很大差别的,当然,对于进程安全的,对于线程肯定也是安全的,但在用户模式下的线程同步所需消耗的代价相对于通过...
  • LuoYe_123456
  • LuoYe_123456
  • 2014年02月11日 22:32
  • 1905

Windows多线程总结(3)-- 线程同步(使用互斥对象实现线程同步)

上一篇说明了多线程是存在着问题的,起始就是多线程操作同一数据而不同步的问题。那么如果实现线程的同步呢?          线程的同步有多种实现方式:         互斥内核对象、事件内核对象、可等待...
  • oBuYiSeng
  • oBuYiSeng
  • 2015年11月27日 18:44
  • 721

Win32多线程之互斥器(Mutexes)

http://blog.csdn.net/wjj715211/article/details/16899667 Win32的Mutex用途和critical section非常类似,但是它牺牲速度以...
  • l799623787
  • l799623787
  • 2014年01月14日 11:51
  • 2146

Java中多线程互斥访问的实现

1、没有实现线程互斥的函数      1.1  没有实现多线程互斥访问的函数 [java] view plain copy  print? static class Outpu...
  • zbw18297786698
  • zbw18297786698
  • 2016年12月02日 15:48
  • 1018

秒杀多线程第七篇 经典线程同步 互斥量Mutex

阅读本篇之前推荐阅读以下姊妹篇: 《秒杀多线程第四篇一个经典的多线程同步问题》 《秒杀多线程第五篇经典线程同步关键段CS》 《秒杀多线程第六篇经典线程同步事件Event》   前面介绍了关键...
  • lien0906
  • lien0906
  • 2015年04月15日 16:08
  • 1570

Windows互斥量内核对象

互斥量内核对象用来确保一个线程独占一个资源的访问。 互斥量对象包含了一个使用计数、线程ID以及一个递归计数。互斥量与关键段的行为完全相同,但是互斥量是内核对象,而关键段是用户模式下的同步对象,因此互...
  • luojian5900339
  • luojian5900339
  • 2015年05月28日 16:55
  • 460

防止程序启动两次的方法CreateMutex()

在工程文件中, WinMain函数里加上以下代码(此代码在BCB6.0下运行): HANDLE hMutex = CreateMutex(NULL, false, "Process"); ...
  • business122
  • business122
  • 2013年07月26日 10:28
  • 1490
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:互斥对象使用CreateMutex
举报原因:
原因补充:

(最多只允许输入30个字)