C++中互斥对象是怎么一回事

来源:百度知道 编辑:UC知道 时间:2024/06/10 12:51:56
进程包括:内核对象和地址段;互斥对象是一种内核对象,它应该属于进程的,但是为什么下面互斥对象可以保证一个程序只能运行一个实例呢?不是每个实例对应一个进程么?两进程间的互斥对象应该是相互不受影响的呀。互斥对象既然是内核对象,难道内核对象是属于程序或系统所有,而非进程所有,那么所说的进程包括内核对象和地址段中的内核对象又是指什么?
int main()
{
hMutex=CreateMutex(NULL,TRUE,"tickets");
if(hMutex)
{
if(ERROR_ALREADY_EXISTS==GetLastError())
{
cout<<"only instance can run!"<<endl;
return;
}
}
}相信我段程序比较清晰,(示编译,只是表示mutex的作用)
感谢一楼的澄清,进程包括:内核对象和地址段,这句话如何理解呢/另关于mutex我还有一个问题。希望也能帮助解决。

我的理解是:
所谓内核对象是系统内核维护的一种数据结构。而进程包括内核对象和地址段则是说内核对象可以被该进程创建和获得。

在运行程序的时候,系统会在该进程中创建创建互斥对象,给其赋名“tickets”,并且该互斥对象现在是被该进程拥有。
当再次运行程序的时候,创建互斥对象时,发现系统内核中有同名的互斥对象了,则出现ERROR_ALREADY_EXISTS。
CreateMutex()第三个参数设为NULL就可以创建多个进程了。

再就是,进程和线程是相对的,互斥对象可用于限制对单一线程的访问,对进程也是一样的。

Mutex,请看MSDN,是系统全局的。

Multiple processes can have handles of the same mutex object, enabling use of the object for interprocess synchronization. The following object-sharing mechanisms are available:

"进程包括:内核对象和地址段;互斥对象是一种内核对象,它应该属于进程的,"
不知道你的理论从何而来的。

一般一个OS,Kernel的最基本功能是管理:内存,进程,线程。
一个进程被加载,一般意味着可以访问Kernel的对象,不代表kernel是从属于Process的。在Windows系统中,已经已经加载了的进程,理论上拥有独立的4GB的内存空间,并非拥有一个独立的Kernel。