友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

VC语言6.0程序设计从入门到精通-第91章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




等待。  

    Win32 提供了创建互斥器          CreateMutex() ,打开互斥器      OpenMutex() ,释放互斥器 

ReleaseMutex()等操作。  

    Mutex 的拥有权并非属于产生它的那个线程,而是属于最后对此  Mutex                        进行等待操作 

( 

 WaitForSingleObject )并且尚未进行 ReleaseMutex()操作的线程。线程拥有 Mutex  就好像进 

入临界区一样,一次只能有一个线程拥有该 Mutex 。如果一个拥有 Mutex 的线程在返回之前 

没有调用 ReleaseMutex() ,那么这个 Mutex 就被舍弃了。当其他线程等待这个 Mutex 时,仍 

能返回,并得到一个 WAIT_ABANDONED_0 返回值,一个 Mutex 被舍弃是 Mutex 特有的功 

能。下面详细介绍 Mutex 相关的函数。  



    (1)CreateMutex  

    函数 CreateMutex 用来创建或打开有名或无名的 Mutex 对象。如果调用成功,函数返回 

创建后对象的句柄 。如果同名 Mutex 对象在创建之前就已经存在,则函数返回现有的对象的 

句柄,并且 GetLastError  函数返回 ERROR_ALREADY_EXISTS 。否则返回创建的 Mutex 对 

象句柄。如果调用失败,返回空值。它的函数原型如下:  



    HANDLE CreateMutex(  



        LPSECURITY_ATTRIBUTES lpMutexAttributes;  



        BOOL bInitialOwner;    



        LPCTSTR lpName    



    );  



    函数中主要参数的意义如下。  

    o  lpMutexAttributes :指向 SECURITY_ATTRIBUTES 结构的指针,决定返回的句柄是否 

      可以被子进程继承。如果为空,则不能被继承。    



                                                                        ·239 ·  


…………………………………………………………Page 251……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



     o  bInitialOwner : 指 定 Mutex   对 象 的 初 始 拥 有 者 。 如 果 调 用 者 创 建           Mutex  并 且 

       bInitialOwner 为 TRUE,调用线程获得 Mutex 对象的拥有权。否则,调用线程不拥有 

       Mutex 的所有权。    

     o  lpName :Mutex 对象的名称。字符串的最大长度为 MAX_PATH 个字符。字符串区分 

       大小写。如果         lpName  和一个现有的         Mutex   对象重名,函数需要对已有的对象有 

       MUTEX_ALL_ACCESS  的访问权。这种情况下,参数 bInitialOwner  被忽略,因为此 

       时它已经被已有的进程初始化。如果 lpMutexAttributes 非空,它决定句柄是否可以被 

       继承,但是它的安全描述成员被忽略。如果 lpName 为空,创建的 Mutex 对象没有名 

       称。    



     (2 )OpenMutex  

     函数 OpenMutex 用来打开一个存在的有名称的 Mutex 对象。如果调用成功,返回打开的 

对象的句柄。反之则返回空值。它的函数原型如下:  



     HANDLE OpenMutex(  



         DWORD dwDesiredAccess;      



         BOOL bInheritHandle;          



         LPCTSTR lpName                      



     );  



     函数主要参数的意义。  

     o  dwDesiredAccess :指定希望对 Mutex 对象进行的访问类型。可以是下面值的组合:  

        · MUTEX_ALL_ACCESS :可以对 Mutex 对象进行所有访问。  

        · SYNCHRONIZE:允许任何等待函数获得 Mutex 对象的所有权。  

     o  bInheritHandle :指定返回的句柄是否可以被继承。    

     o  lpName :要打开的 Mutex 对象的名称。  



     (3 )ReleaseMutex  

     函数 ReleaseMutex 释放指定的 Mutex 对象的所有权。如果调用线程没有 Mutex 对象的所 

有权,则说明调用失败。它的函数原型如下:  



     BOOL ReleaseMutex(  



         HANDLE hMutex        



     );  



     函数中主要参数的意义如下。  

     o  hMutex :Mutex 对象的句柄。  



     (4 )CMutex  

     Mutex 在 MFC  中相应的类是 CMutex 。CMutex 通过构造函数创建一个互斥器对象。当 

某个资源在一个时间只允许一个线程访问的时候,互斥器正好派上用场。  

     CMutex 只有一个构造函数 CMutex::CMutex,它的函数原型如下: 



     CMutex(    



      BOOL bInitiallyOwn = FALSE;    



      LPCTSTR lpszName = NULL;    



      LPSECURITY_ATTRIBUTES lpsaAttribute = NULL    



 ·240 ·  


…………………………………………………………Page 252……………………………………………………………

                                                                            第 9 章    多线程  



    );  



     函数中主要参数的意义如下。  

    o  bInitiallyOwn :指定创建线程是否在 CMutex 对象初始创建时访问互斥器控制的资源。  

    o  lpszName :CMutex   对象的名称。如果有同名的互斥器存在,如果为空,互斥器就没 

       有名称。如果和已有的互斥对象同名,构造函数创建一个以存在名称为参考的新的 

       CMutex 对象。如果名称和已有的其他同步对象同名,构造将失败。  

    o  lpsaAttribute :互斥对象的安全属性。  



     5 .信号量(Semaphore)  



     信号量是最具历史的同步机制 。信号量是解决 producer/consumer  问题的关键要素。对应 

的 MFC 类是 CSemaphore 。Win32 函数 CreateSemaphore()用来产生信号量。ReleaseSemaphore() 

用来解除锁定。Semaphore  的现值代表的意义是目前可用的资源数,如果 Semaphore  的现值 

为 1,表示还有一个锁定动作可以成功。如果现值为 5,就表示还有 5 个锁定动作可以成功。 

当调用 Wait 等函数要求锁定,如果 Semaphore 现值不为 0,Wait 马上返回,资源数减 1。当 

调用 ReleaseSemaphore()资源数加 1,当时不会超过初始设定的资源总数。  



     (1)CreateSemaphore  

     函数 CreateSemaphore 用来创建或者打开 Semaphore 对象。如果调用成功,函数返回创 

建后的对象句柄。如果同名 Semaphore 对象在创建之前就已经存在,则函数返回现有的对象 

的句柄,并且 GetLastError 函数返回 ERROR_ALREADY_EXISTS 。否则返回创建的 Semaphore 

对象句柄。如果调用失败,返回空值。它的函数原型如下:  



    HANDLE CreateSemaphore(  



        LPSECURITY_ATTRIBUTES lpSemaphoreAttributes;    



        LONG lInitialCount;                                                      



        LONG lMaximumCount;                                              



        LPCTSTR lpName                                                        



    );  



     函数中主要参数的意义如下。  

    o  lpSemaphoreAttributes :指定 SECURITY_ATTRIBUTES 结构的指针。决定返回的句柄 

       是否可以被子进程继承。如果 lpSemaphoreAttributes 为空,则句柄不能被继承。  

    o  lInitialCount :指定 Semaphore 对象的初始计数值 。该值必须大于或等于零并小于或等 

       于 lMaximumCount 。  

    o  lMaximumCount :指定 Semaphore 对象的最大数目。必须大于零。    

    o  lpName :Semaphore 对象的名称。字符串的最大长度为 MAX_PATH  个字符。字符串 

       区分大小写。  



     (2 )OpenSemaphore  

     函数 OpenSemaphore 用来�
返回目录 上一页 下一页 回到顶部 赞(1) 踩(1)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!