|
查看: 1238|回复: 6
|
如何禁止多线程同时访问同一个函数
[复制链接]
|
|
|
比如说我有一个函数- int foo(void)
- {
- HANDLE hMutex;
- do
- {
- hMutex = CreateMutex(0, 0, "foo()");
- _sleep(0);
- }while(!hMutex || (GetLastError() == ERROR_ALREADY_EXISTS));
-
- printf("fuuuyoh\n");
- ReleaseMutex(hMutex);
- CloseHandle(hMutex);
- return 0;
- }
复制代码 线程1执行foo(); //执行中
线程2执行foo(); //等待中
线程3执行foo(); //等待中
我想做到的是,当线程1正在访问foo()时其比他迟访问foo()的线程的会等待.
现在我的问题是...当地一个线程访问完毕后, 其他线程仍然逗留在 do...while的循环当中(变成了死循环).
第一次用CreateMutex()不知道是否用法正确...请多多指教。谢谢
[ 本帖最后由 megablue 于 13-3-2008 04:24 PM 编辑 ] |
|
|
|
|
|
|
|
|
|
|
发表于 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 编辑 ] |
|
|
|
|
|
|
|
|
|
|
发表于 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吧! |
|
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|