宏在多线程跨平台开发中的应用

http://blog.sina.com.cn/s/blog_6296cebc0100fdks.html

宏在多线程跨平台开发中的应用

 —— 东方射日 ——

C++基础篇


现在做的一个工程是多线程应用,同时用在WindowsMac 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  pthread_t                   THREAD_HANDLE;

#define END_THREAD(x)                pthread_exit(x)

#define SAME_THREAD(x,y)             (pthread_equal((x), (y)) == 0)

 

#include "macsemaphore.h"

typedef  Mac_sem_t                        SEMAPHORE_HANDLE;

#define CREATE_SEMAPHORE(x,initVal,maxVal)         Mac_sem_init(&(x),0, initVal)

#define WAIT_SEMAPHORE(x)        Mac_sem_wait(&(x))

#define INCREASE_SEMAPHORE(x)        Mac_sem_post(&(x))

#define DESTROY_SEMAPHORE(x)         Mac_sem_destroy(&(x))

#define  GET_SEMAPHORE_VALUE(x, v)   Mac_sem_getvalue(&(x), v)

 

 

typedef pthread_mutex_t              MUTEX_HANDLE;

#define CREATE_MUTEX(x)              pthread_mutex_init(&(x), NULL)

#define LOCK_MUTEX(x)                pthread_mutex_lock(&(x))

#define RELEASE_MUTEX(mutex)         pthread_mutex_unlock(&(mutex))

#define RELEASE_MUTEX_THREAD(mutex,threadNum)      if( (threadNum) > 1 ) pthread_mutex_unlock(&(mutex))

#define DESTROY_MUTEX(x)             pthread_mutex_destroy(&(x))

#define MUTEX_INIT(x,v)              pthread_mutex_init(&(x),(v))

 

typedef  void *             THREAD_ENTRY;

#define WINAPI

#else

 

typedef  HANDLE                           THREAD_HANDLE;

#define END_THREAD(x)                TerminateThread((x), 0);

#define SAME_THREAD(x,y)             ((x) == (y))

 

typedef  HANDLE                           SEMAPHORE_HANDLE;

#define CREATE_SEMAPHORE(x,initVal,maxVal)     (x) = CreateSemaphore(NULL,initVal, maxVal, NULL)

#define WAIT_SEMAPHORE(x)            WaitForSingleObject((x), INFINITE)

#define INCREASE_SEMAPHORE(x)        ReleaseSemaphore((x), 1, NULL);

#define DESTROY_SEMAPHORE(x)         CloseHandle((x))

#define  GET_SEMAPHORE_VALUE(x, v)

 

typedef  HANDLE                           MUTEX_HANDLE;

#define CREATE_MUTEX(x)              (x) =  CreateMutex(NULL,FALSE,NULL)

#define LOCK_MUTEX(x)                WaitForSingleObject((x), INFINITE)

#define RELEASE_MUTEX(mutex)         ReleaseMutex((mutex))

#define RELEASE_MUTEX_THREAD(mutex,threadNum)      if( (threadNum) > 1 ) ReleaseMutex((mutex))

#define DESTROY_MUTEX(x)             CloseHandle((x))

#define MUTEX_INIT(x,v)              (x) = (v)

 

typedef  DWORD              THREAD_ENTRY;

#endif

 

 

在源代码中,不同平台的代码是一样的:

举几个例子:

线程入口:

THREAD_ENTRY WINAPI DecoderConcrete::Thread_func()

信号量的定义和初始化:

SEMAPHORE_HANDLE   mSemHandle;

CREATE_SEMAPHORE(mSemHandle, 0, 1000);

增加和等待信号量:

INCREASE_SEMAPHORE(mSemHandle);

WAIT_SEMAPHORE(mSemHandle);

 

现在你看看代码是不是显得干净和清晰?下回增加Linux的支持,也只需要在platform.h中添加相应代码就好了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值