65.9K
CodeProject 正在变化。 阅读更多。
Home

跨平台互斥锁

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.71/5 (9投票s)

2008年4月25日

CPOL

1分钟阅读

viewsIcon

43443

在跨平台编程中使用互斥锁

引言

这是我的第一篇文章,所以……开始吧。:)

使用代码

互斥锁(通常缩写为 mutex)用于并发编程,以避免同时使用公共资源。

一个可以使用互斥锁的例子是在多线程应用程序中,向列表中插入项目时。

Windows 和 Linux 编程中的互斥锁实现略有不同,但通过一些编码,你可以同时在两者中使用相同的机制。

为此,我们将使用如下宏:

			#if defined(LINUX)
			..... //do this if it is for linux
			#elif defined(WINDOWS)
			..... //do this if it is for windows
			#endif
		

为了实现跨平台,我们将使用一个头文件和一个 .cpp 文件。

让我们从头文件开始。首先要做的是包含互斥锁的头文件。这些文件在 Windows 和 Linux 中是不同的。以下是代码:

			//cross.h
			#if defined(LINUX)
				#include <pthread.h>
			#elif defined(WINDOWS)
				#include <windows.h>
				#include <process.h>
			#endif
		

在 Windows 中,互斥锁被定义为 HANDLE 数据类型,而在 Linux 中,我们使用 pthread_mutex_t 来表示互斥锁。

代码现在应该如下所示:

			//headers
			#if defined(LINUX)
				#include <pthread.h>
			#elif defined(WINDOWS)
				#include <windows.h>
				#include <process.h>
			#endif

			//data types
			#if defined(LINUX)
				#define MUTEX pthread_mutex_t
			#elif defined(WINDOWS)
				#define MUTEX HANDLE
			#endif

现在我们需要声明我们将使用的函数:初始化、锁定和解锁互斥锁。完整的代码现在应该如下所示:

			//Headers
			#if defined(LINUX)
				#include <pthread.h>
			#elif defined(WINDOWS)
				#include <windows.h>
				#include <process.h>
			#endif

			//Data types
			#if defined(LINUX)
				#define MUTEX pthread_mutex_t
			#elif defined(WINDOWS)
				#define MUTEX HANDLE
			#endif

			//Functions
			int MUTEX_INIT(MUTEX *mutex);
			int MUTEX_LOCK(MUTEX *mutex);
			int MUTEX_UNLOCK(MUTEX *mutex);

我们的函数将由 cross.cpp 文件持有。

int MUTEX_INIT(MUTEX *mutex)
{
    #if defined(LINUX)
        return pthread_mutex_init (mutex, NULL);;
    #elif defined(WINDOWS)
        *mutex = CreateMutex(0, FALSE, 0);;
        return (*mutex==0);
    #endif
    return -1;
}

int MUTEX_LOCK(MUTEX *mutex)
{
    #if defined(LINUX)
        return pthread_mutex_lock( mutex );
    #elif defined(WINDOWS)
        return (WaitForSingleObject(*mutex, INFINITE)==WAIT_FAILED?1:0);
    #endif
    return -1;
}

int MUTEX_UNLOCK(MUTEX *mutex)
{
    #if defined(LINUX)
        return pthread_mutex_unlock( mutex );
    #elif defined(WINDOWS)
        return (ReleaseMutex(*mutex)==0);
    #endif
    return -1;
}

我不会深入探讨这些函数的细节,你可以使用 MSDN(Windows)和 mkssoftware(Linux)来获取更多信息,如果你需要的话。

使用代码

首先,你需要定义 WINDOWS 或 LINUX,以便编译器知道平台。这是在 Windows 和 Linux 之间切换时需要更改的全部内容。互斥锁的代码是相同的,你可以这样使用它:

//declare the mutex:
MUTEX mutex;
//Initialize the mutex:
MUTEX_INIT(&mutex);
//Lock the mutex:
MUTEX_LOCK(&mutex);
//Unlock the mutex:
MUTEX_UNLOCK(&mutex);

结论

我希望这篇文章对你有所帮助。

文章由 Multiplex Games 提供支持

© . All rights reserved.