http://blog.sina.com.cn/s/blog_6296cebc0100fdks.html
宏在多线程跨平台开发中的应用
C++基础篇
现在做的一个工程是多线程应用,同时用在Windows和Mac OS下,未来还必须移植到Linux。这里就涉及一个跨平台开发的问题。
我们知道多线程的相关函数在不同平台下是不同的,比如初始化一个互斥锁,在Windows下是:
HANDLE CreateMutex(…)
在Linux下是:
Void pthread_mutex_init(pthread_mutex_t x, …)
函数的接口和参数都不相同。
当然,在开发中,我们可以用预编译来解决这些问题,例如:
#if WINDOWS
HANDLE mMutexHandle;
#elif MAC_OS
pthread_mutex_t mMutextT;
#endif
:
:
#if WINDOWS
mMutexHandle = CreateMutex(NULL,FALSE,NULL);
#elif MAC_OS
pthread_mutex_init(&mMutexT, NULL);
#endif
这样做当然是没有问题的,不过我个人很不喜欢这种风格,在源代码中到处都是#if---#else---#endif,严重影响可读性,另外如果日后你要添加Linux的支持,那么你还需要在每个地方都再添加一个#elif分支。
有没有简便一些的办法呢?比如将所有的#if---#else---#endif集中在一个地方,源代码中对各个平台都是一样的,甚至未来添加一种平台的支持,我们也可以不用或至少最小化对源代码的修改呢?
如果我们能熟练应用宏的话,我们是有这样的办法的,下面我给出我在本工程中platform.h头文件的一部分,我相信你一看就明白了:(支持多线程和互斥锁,信号量)
#if _MAC_OS
#include <string.h>
#include <pthread.h>
typedef
#define END_THREAD(x)
#define SAME_THREAD(x,y)
#include "macsemaphore.h"
typedef
#define CREATE_SEMAPHORE(x,initVal,maxVal)
#define WAIT_SEMAPHORE(x)
#define INCREASE_SEMAPHORE(x)
#define DESTROY_SEMAPHORE(x)
#define
typedef pthread_mutex_t
#define CREATE_MUTEX(x)
#define LOCK_MUTEX(x)
#define RELEASE_MUTEX(mutex)
#define RELEASE_MUTEX_THREAD(mutex,threadNum)
#define DESTROY_MUTEX(x)
#define MUTEX_INIT(x,v)
typedef
#define WINAPI
#else
typedef
#define END_THREAD(x)
#define SAME_THREAD(x,y)
typedef
#define CREATE_SEMAPHORE(x,initVal,maxVal)
#define WAIT_SEMAPHORE(x)
#define INCREASE_SEMAPHORE(x)
#define DESTROY_SEMAPHORE(x)
#define
typedef
#define CREATE_MUTEX(x)
#define LOCK_MUTEX(x)
#define RELEASE_MUTEX(mutex)
#define RELEASE_MUTEX_THREAD(mutex,threadNum)
#define DESTROY_MUTEX(x)
#define MUTEX_INIT(x,v)
typedef
#endif
在源代码中,不同平台的代码是一样的:
举几个例子:
线程入口:
THREAD_ENTRY WINAPI DecoderConcrete::Thread_func(…);
信号量的定义和初始化:
SEMAPHORE_HANDLE
CREATE_SEMAPHORE(mSemHandle, 0, 1000);
增加和等待信号量:
INCREASE_SEMAPHORE(mSemHandle);
WAIT_SEMAPHORE(mSemHandle);
现在你看看代码是不是显得干净和清晰?下回增加Linux的支持,也只需要在platform.h中添加相应代码就好了。