巨集在多執行緒跨平台開發中的應用

2021-06-10 11:45:16 字數 4020 閱讀 1456

巨集在多執行緒跨平台開發中的應用

—— 東方射日 ——

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中的使用 如何防止執行緒的記憶體洩漏?...