关于提问一个CreateMutex线程操作的问题

wangwei244157887 2010-02-25 11:39:40
问题一:
如果我这样创建hMutex:=CreateMutex(nil,False,nil);//创建互斥量,创建该线程的互斥对象不拥有该线程,
那为什么还需要releaseMutex去释放该对象呢,既然没有拥有者,这里的拥有者又是什么意思呢。
还有如果创建互斥对象的主线程作为互斥对象的拥有者,这样创建有什么作用吗?

问题二:
DWORD WaitForSingleObject(

HANDLE hHandle, // handle of object to wait for
DWORD dwMilliseconds // time-out interval in milliseconds
);

这里的dwMilliseconds 参数如果设置为0的话,返回值有吗?或者说返回值只有wait_object_0,而别的值不可能产生啊?
这个函数的意思:使当前线程睡眠由参数dwMilliseconds 指定的时间,直到由hhandel参数指定的互斥对象进入发信号状态为止,这里面的发信号状态有点抽象,希望解释一下,谢谢。
...全文
251 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2010-02-25
  • 打赏
  • 举报
回复
如果互斥对象处于发信号状态,如果在辅助线程里面使用了WaitForSingleObject,函数那么辅助线程是不是拥有了互斥对象?如果在主线程使用这个函数,是不是主线程拥有这个函数?这样一个拥有过程和createMutex这个函数把第二个参数设置为True的话。本质上的拥有过程是不是一样的?

还有在线程里面拥有互斥对象,是不是不需要释放的啊?,因为我看了releaseMutex其实是释放互斥对象的状态让它处于发信号状态还是非发信号状态,而不是使线程不拥有该互斥对象, 我这样里面对吗?线程拥有互斥对象,只是为了要去的互斥对象状态才去拥有,拥有之后不必像DELPHI里面对象那样进行FreeAndNil的,我这样理解对吗?刚才仔细看了一下书,。望各位指点一二,这里面有点混
「已注销」 2010-02-25
  • 打赏
  • 举报
回复
嘿嘿,我只是好奇问问啊,学习ing
fang 2010-02-25
  • 打赏
  • 举报
回复
楼主是想用Mutex来处理同一个进程只能打开一个实例吧。mutex是内核对象,其实进程也可以访问,
hMutex:=CreateMutex(nil,False,nil);这里面第三个参数,互斥名,在什么地方用得着呢,这个OpenMutex要用到。
「已注销」 2010-02-25
  • 打赏
  • 举报
回复
谢谢SQLDebug_Fan和IDWB的热心帮助.....
「已注销」 2010-02-25
  • 打赏
  • 举报
回复
关于WaitForSingleObject的第二个参数,下面是帮助的定义
if dwMilliseconds is zero, the function tests the object's state and returns immediately. If dwMilliseconds is INFINITE, the function's time-out interval never elapses.

我的理解是上面的意思是,如果设置为0的话,就是立即返回,那到底有没有返回值,如果设置为0,信号状态怎么取得呢?还是根本不可以,你上面的解释是设置为INFINITE的时候。
IDWB 2010-02-25
  • 打赏
  • 举报
回复
WaitForSingleObject就是什么也不干等待一个指定时间长度,如果有信号过来那么继续执行下面操作,如果没有信号那么将产生一个timeout的返回值,程序还是继续往下执行,如果有多个WaitForSingleObject等待一个信号源,那么一旦有信号来了那么只会通知其中的一个等待过程,其他的将继续等待,通过我做过的试验好像是根据堆栈的方式触发,而非队列先进先出顺序。另外WaitForSingleObject中的信号源创建时的其中一个参数决定这个信号源的复原方式
SQLDebug_Fan 2010-02-25
  • 打赏
  • 举报
回复
一、Mutex和线程的关系,是那个线程创建的Mutex,就是那个线程拥有Mutex,应该在这个线程中释放Mutex,一般情况下都是在主线程创建,在主线程中销毁。ReleaseMutex只是改变Mutex的状态,要释放Mutex要使用CloseHandle来关闭这个句柄;
二、WaitForSingleObject如果dwMilliseconds设为0表示一直等待下去,直到等待句柄返回为止,它也是有返回值的,返回值的含义:
WAIT_ABANDONED 0x00000080:当hHandle为mutex时,如果拥有mutex的线程在结束时没有释放核心对象会引发此返回值。
  WAIT_OBJECT_0 0x00000000 :核心对象已被激活
  WAIT_TIMEOUT 0x00000102:等待超时
  WAIT_FAILED 0xFFFFFFFF :出现错误,可通过GetLastError得到错误代码

CreateMutex的第三个参数是Mutex的名称,如果你指定了名称,你调用了CreateMutex(nil, False, 'TestMutex'),则系统创建一个名为TestMutex的互斥量,下次你再调用CreateMutex(nil, False, 'TestMutex')它返回上次的句柄,而不是再重新创建一个。如果你要创建在服务程序和桌面程序共享的互斥量,可以参考以下代码:

program FleetReportSvr;

uses
SvcMgr,
Forms,
SysUtils,
Windows,
SvrMain in 'SvrMain.pas' {FleetReportService: TService},
AppMain in 'AppMain.pas' {FmFleetReport};

{$R *.RES}

const
CSMutexName = 'Global\Services_Application_Mutex';
var
OneInstanceMutex: THandle;
SecMem: SECURITY_ATTRIBUTES;
aSD: SECURITY_DESCRIPTOR;
begin
InitializeSecurityDescriptor(@aSD, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@aSD, True, nil, False);
SecMem.nLength := SizeOf(SECURITY_ATTRIBUTES);
SecMem.lpSecurityDescriptor := @aSD;
SecMem.bInheritHandle := False;
OneInstanceMutex := CreateMutex(@SecMem, False, CSMutexName);
if (GetLastError = ERROR_ALREADY_EXISTS)then
begin
DlgError('Error, Program or service already running!');
Exit;
end;
if FindCmdLineSwitch('svc', True) or
FindCmdLineSwitch('install', True) or
FindCmdLineSwitch('uninstall', True) then
begin
SvcMgr.Application.Initialize;
SvcMgr.Application.CreateForm(TSvSvrMain, SvSvrMain);
SvcMgr.Application.Run;
end
else
begin
Forms.Application.Initialize;
Forms.Application.CreateForm(TFmFmMain, FmMain);
Forms.Application.Run;
end;
end.
「已注销」 2010-02-25
  • 打赏
  • 举报
回复
hMutex:=CreateMutex(nil,False,nil);这里面第三个参数,互斥名,在什么地方用得着呢?呵呵,不懂得比较多

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧