权限问题
互斥量对象会一直存活着直到使用它的最后一个程序关闭其句柄,因此它能在初始创建它的应用程序退出后保留相当长的时间。因为此对象被广泛地共享,所以它必须被赋予明确的许可以允许任何人使用它。事实上,“缺省”许可几乎从不适用。 对于 SYNCHRONIZE和MUTEX_ALL_ACCESS 权限,因为非管理员没有这些权限(仅有上列的少许)互斥量不能被打开或者获取,于是CreateMutex() 和OpenMutex() 返回NULL。因此,当对象已经存活于内存中时硬性改变其上的许可配置:(需要调用 SetKernelObjectSecurity(),下列程序片断展示一个程序如何才能打开互斥量并安装一个新的 DACL,此 DACL 即使在程序退出后也仍然保持着,只要任一其他程序还维护有它的句柄)
...
// open the mutex that we're going to adjust
HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "DBWinMutex");
// create SECURITY_DESCRIPTOR with an explicit, empty DACL
// that allows full access to everybody
SECURITY_DESCRIPTOR sd;
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(
&sd, // addr of SD
TRUE, // TRUE=DACL present
NULL, // ... but it's empty (wide open)
FALSE); // DACL explicitly set, not defaulted
// plug in the new DACL
SetKernelObjectSecurity(hMutex, DACL_SECURITY_INFORMATION, &sd);
...
例子:
HANDLE hEventQuit = NULL;
hEventQuit = CreateEvent(NULL, FALSE, FALSE, NULL);
DWORD WINAPI ThreadOperation()
{
HANDLE hMutex = NULL;
// Create SECURITY_DESCRIPTOR with an explicit, empty DACL
// that allows full access to everybody
SECURITY_DESCRIPTOR sd;
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(
&sd, // addr of SD
TRUE, // TRUE=DACL present
NULL, // ... but it's empty (wide open)
FALSE); // DACL explicitly set, not defaulted
// Open the mutex that we're going to adjust
hMutex = OpenMutex(MUTEX_ALL_ACCESS, NULL, _T("Global\\MutexName"));
if (NULL == hMutex)
{
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.bInheritHandle = FALSE;
sa.lpSecurityDescriptor = &sd;
hMutex = CreateMutex(&sa, FALSE, _T("Global\\MutexName"));
}
// Plug in the new DACL
SetKernelObjectSecurity(hMutex, DACL_SECURITY_INFORMATION, &sd);
if (NULL != hMutex)
{
HANDLE hMutexHandles[] = {hMutex, hEventQuit};
DWORD dwMutexResult = WaitForMultipleObjects(
_countof(hMutexHandles),
hMutexHandles,
FALSE,
INFINITE);
switch(dwMutexResult)
{
case WAIT_OBJECT_0: //scucess
//Do yourself things
break;
case WAIT_OBJECT_0 + 1: //quit,cancel thread
break;
case WAIT_ABANDONED:
//not release mutex and not response
break;
default: //failure
//decide operation yourself
break;
}
ReleaseMutex(hMutex);
}
else
{
CloseHandle(hMutex);
}
return 0;
}
延伸:
互斥对象
1. 互斥对象(mutex)属于内核对象,它能够确保线程拥有对单个资源的互斥访问权。
2. 互斥对象包含一个使用数量,一个线程ID和一个计数器。
3. ID用于标识系统中的哪个线程当前拥有互斥对象,计数器用于指明该线程拥有互斥对象的次数。
涉及到三个函数:
1. CreateMutex:创建互斥对象,返回互斥对象的句柄,其中第二个参数如果是TRUE,表示调用该函数的线程拥有互斥对象的所有权,即互斥对象处于非空闲状态。如果是FALSE,则表示当前互斥对象处于空闲状态,其他线程可以占用。
2. WaitForSingleObject(WaitForMultipleObject):等待互斥对象的使用权,如果第二个参数设置为INFINITE,则表示会持续等待下去,直到拥有所有权,才有权执行该函数下面的语句。一旦拥有了所有权,则会将互斥对象的的线程ID设置为当前使用的线程ID值。
3. ReleaseMutex:将互斥对象所有权进行释放,交还给系统。
可以将互斥对象想象成一把钥匙,CreateMutex创建了这把钥匙,WaitForSingleObject等待这把钥匙去访问一个公共的资源,比如一个房间,如果拥有了钥匙,则这个房间的所有权就属于这个进程了,别人是进不去这个房间的,直到进程将这个房间的钥匙归还掉,即ReleaseMutex。
访问控制项 (ACE)
安全描述符 (SD)
随机访问控制列表 (DACL)
当允许访问的 ACE 被添加到文件的随机访问控制列表 (DACL) 中时,相应用户或组帐户与 ACE 关联将由提供与该文件允许访问系统。大多数的情况文件的 DACL 不足够大,以添加更多的 ACE。因此,就需要创建一个新的访问控制列表 (ACL) 和从该文件的现有 DACL 按首选顺序复制ace。新的 DACL 然后可以替换该文件的安全描述符 (SD) 中旧的 DACL。
分享到:
相关推荐
图文并茂Mutex性能问题解析,理解Mutex的机制,对于理解共享池的争用,意义巨大
c++11多线程库中互斥库模块的使用方式,介绍了mutex类和time_mutex类的使用方式
mutex在线程中的使用 简单操作 全局变量 在vs2008 c++
LinuxC线程同步Mutex实例,让你一目了然
使用Mutex对象实现多线程同步,打印输出结果,对比非同步情况下的输出结果,对比明显,更容易理解Mutex对象实际意义。
游戏外挂 多开用的上 mutex 互斥体 game dll
一个关于互斥量使用的简单实例,主要使用CreateMutex, ReleaseMutex等。
使用互斥对象(Mutex)实现线程同步。MFC工程
linux mutex锁的使用demo,适合新手学习。
To be noticed, wai() will unlock mutex and will continue when the relevant mutex be unlocked. Signal() will not release the mutex which means it will go ahead without waiting for anything.
利用mutex互斥变量实现线程同步机制,并输出循环1000000次所用的时间
Laravel开发-laravel-mutex 拉拉维尔的静音储物柜。
ucos-ii中互斥信号mutex建立源码
C# 使用Mutex和AutoResetEvent类处理多线程同步与互斥,调试并完善了网上文档的代码。经测试能很好地实现要求,但还有一些地方不是特别明白,都写在注释中了,请高手给予指点。
linux 内核 mutex.c 源码分析实例,我的实例主要先初始化了一个互斥体m,然后获取互斥体的锁(解锁),紧接着释放互斥体的锁(解锁)。最后释放互斥体。中间通过输出m.count来显示互斥体的状态。
windows多用户多session下使用Mutex进行同步控制,程序为MFC Dialog程序,VS2010下编译。windows 2012下测试。
kernel/mutex.c源代码分析 内核抢占:如果进程正执行内核函数时,即它在内核态运行时,允许发生内核切换,这个内核就是抢占的。 临界区就是指访问和操作共享数据的代码段。 并发是指两个或两个以上数目的执行线程在...
linux上C++互斥线程Mutex的代码及解释,很有用
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutex_t *restrict attr); //初始化mutex int pthread_mutex_destroy(pthread_mutex_t *mutex); //如果mutex是动态分配的,则释放内存前...
利用mutex object编写的多线程运用程序, 可以直接运行,可以手动改变线程优先级, 很直观。