跨平台互斥锁
在跨平台编程中使用互斥锁
引言
这是我的第一篇文章,所以……开始吧。:)
使用代码
互斥锁(通常缩写为 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 提供支持