佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1239|回复: 6

如何禁止多线程同时访问同一个函数

[复制链接]
发表于 13-3-2008 03:53 PM | 显示全部楼层 |阅读模式
比如说我有一个函数
  1. int foo(void)
  2. {
  3.         HANDLE hMutex;
  4.         do
  5.         {
  6.                 hMutex = CreateMutex(0, 0, "foo()");
  7.                 _sleep(0);
  8.         }while(!hMutex || (GetLastError() == ERROR_ALREADY_EXISTS));
  9.    
  10.         printf("fuuuyoh\n");

  11.         ReleaseMutex(hMutex);
  12.         CloseHandle(hMutex);
  13.         return 0;
  14. }
复制代码
线程1执行foo(); //执行中
线程2执行foo(); //等待中
线程3执行foo(); //等待中

我想做到的是,当线程1正在访问foo()时其比他迟访问foo()的线程的会等待.
现在我的问题是...当地一个线程访问完毕后, 其他线程仍然逗留在 do...while的循环当中(变成了死循环).
第一次用CreateMutex()不知道是否用法正确...请多多指教。谢谢

[ 本帖最后由 megablue 于 13-3-2008 04:24 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 14-3-2008 12:30 PM | 显示全部楼层
用一个简单的semaphore 就可以吧。
int foo(void){         
while ( s < 0 );         
s--;                        
//这里 放 你要的 一堆程序 (atomically 执行)                                         
s++;                        
return 0;}

[[i] 本帖最后由 tensaix2j 于 14-3-2008 12:33 PM 编辑 [/i]]
回复

使用道具 举报

发表于 14-3-2008 04:19 PM | 显示全部楼层
如果你是用VC++/MFC的話,就容易一點了。
CMutex MyMutex; // 一定要定義為 global variable.

......

void foo(void)
{
    MyMutex.Lock();
    do
    {
         //do something
    }while(....);
    MyMutex.Unlock();
}

如果你用MFC的話,當你定義為Global Variable時,它已經為你Create,和Open了。你也不用release 和Close,因爲你的程序終止后,它自動釋放的。

你只需要Lock()與Unlock()而已。
如果你只是要限制于自己的程序以内而已,那麽
CCriticalSection 就已經足夠了。
CMutex 是使用於 Global 即本程序與以外的程序也可以運用。
回复

使用道具 举报

发表于 14-3-2008 08:31 PM | 显示全部楼层
好熟悉的semaphore, 不过我忘到光光....只记得deathlock
回复

使用道具 举报

发表于 14-3-2008 08:32 PM | 显示全部楼层
好熟悉的semaphore, 不过我忘到光光....只记得deathlock
回复

使用道具 举报

 楼主| 发表于 15-3-2008 03:49 AM | 显示全部楼层
谢谢,试了tensaix2j的方法。
但是刚刚才发现问题不在多线程
我笨笨的,不会MFC
不喜欢用大型的framework.

[ 本帖最后由 megablue 于 15-3-2008 03:52 AM 编辑 ]
回复

使用道具 举报

Follow Us
发表于 16-3-2008 12:07 AM | 显示全部楼层
用法很簡單:
在某処定義global的 CRITICAL_SECTION,然後使用前初始化它:
#include <windows.h>
CRITICAL_SECTION cs;

InitializeCriticalSection(&cs);

在離開與終止程序時釋放它:
DeleteCriticalSection(&cs);

void foo(void)
{
   EnterCriticalSection(&cs);
   do
   {
         //do something
   }while(...);
   LeaveCriticalSection(&cs);
}

Mutex的話:
在使用前創建:
HANDLE mutex;
mutex = CreateMutex(0, FALSE, 0);

在離開與終止程序時釋放它:
CloseHandle(mutex);

void foo(void)
{
   WaitForSingleObject(mutex, INFINITE);
   do
   {
         //do something
   }while(...);
   ReleaseMutex(mutex));
}

詳細的用法,參考Win32API吧!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 31-12-2025 02:31 PM , Processed in 0.132764 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表