巨集在多執行緒跨平台開發中的應用
—— 東方射日 ——
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
#include
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
中新增相應**就好了。
vector在實際多執行緒開發中的應用
首先宣告使用vector的時候執行緒並不是安全的,使用get訪問vector時出現了越界,這裡只是講述筆者在實際開發中vector的應用 1 初始化乙個實體類 usersynandsubs usersynandsub new usersynandsubs 實體類usersynandsubs 有對應的...
需要跨平台的多執行緒類
多謝beej的socket教程,經過近兩天的學習,socket通訊的機制大概有了了解。我發現想更好地了解socket通訊,特別是p2p通訊,多執行緒是難免的。我現在缺少乙個跨平台的多執行緒類!是自己寫?還是找個免費的?先找找linux下的 多執行緒 資料看看再說吧。聽說linux下沒有執行緒的概念,...
多執行緒在Android中應用
asynctask 如何使用?asynctask原理及不足 asynctask不足 asynctask記憶體洩漏問題 如何取消asynctask?sp是程序同步的嗎?有什麼方法做到同步?多程序是支援的但是大量同時讀寫操作也會存在問題,談談多執行緒在android中的使用 如何防止執行緒的記憶體洩漏?...