2010-08-18 41 views
5

Microsoft Visual C++編譯器具有允許線程之間同步的對象EnterCriticalSectionExitCriticalSectionLinux上的gcc等同於微軟的關鍵部分是什麼?

什麼是GCC等值?

我看到周圍__sync_synchronize引用與__scoped_lock

其實我看到一些原子__sync功能提到了一些 __atomic那些沿着。

我實際上一直在使用__sync_fetch_and_add作爲我的原子增量 應該用__atomic_add_dispatch代替嗎?
有什麼區別?

我應該使用哪些?是否有一些C++中的構造函數可用於最新版本的GCC和Visual C++ 2010中,這些構造函數可用於編寫一些跨平臺代碼。

我看到boost有一些可用的函數,但由於各種原因,我不允許在windows下使用boost。

+0

我想你不能使用任何其他圖書館要麼呢? Qt有一個很好的(跨平臺)線程API。 – Job 2010-08-18 07:09:14

回答

13

在Linux(和其他Unixen)上,您需要使用PThreads或Posix Threads。在Windows上沒有等同於關鍵部分;改爲使用互斥體。

編輯:看到下面的第一條評論 - 顯然Posix Mutexes是相同的Win32關鍵部分,因爲他們被綁定到一個單一的過程。

+3

實際上,POSIX互斥體相當於Win32臨界區(過程有界)。在跨進程中,Win32 Mutex與Critical Sections有所不同。 – MSalters 2010-08-18 08:33:28

+0

@ MSalters:啊 - 不知道。必須粉碎術語重用。 – 2010-08-18 13:17:12

+0

@ MSalters,另外,Win32臨界區比Win32互斥體快很多,因爲它們在用戶空間中實現,並且不涉及與系統調用相關的開銷。雖然我不知道Posix互斥體? – Tanuj 2010-10-13 15:49:10

2

EnterCriticalSection其餘的API是Win32 API。至於跨平臺同步API,我不認爲有(因爲你提到你不能使用boost)。另外,你提到了跨平臺,這是否意味着不同的體系結構(對於gcc部分而言)。 我見過一個大型實現,其中提供了一組常見的API,這些API被有條件地編譯爲具有本機API(如AIX上的fetch_and_add)或者使用pthreads Win32 API。 我曾嘗試使用posix threads on win32,但遇到了一堆問題(但這是一個非常舊的版本)。現在YMMV。

6

入住這裏:http://en.wikipedia.org/wiki/Critical_section

/* Sample C/C++, Unix/Linux */ 
#include <pthread.h> 

/* This is the critical section object (statically allocated). */ 
static pthread_mutex_t cs_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; 

void f() 
{ 
    /* Enter the critical section -- other threads are locked out */ 
    pthread_mutex_lock(&cs_mutex); 

    /* Do some thread-safe processing! */ 

    /*Leave the critical section -- other threads can now pthread_mutex_lock() */ 
    pthread_mutex_unlock(&cs_mutex); 
} 

int main() 
{ 
    f(); 

    return 0; 
} 
1

如果你正在開發只適用於Windows平臺的方案,我認爲最好的方法是使用Win32 API。否則,你可以使用Qt C++庫(爲此Qt Core就足夠了)。

參見:QMutexQMutexLocker 您還可以使用:QReadWriteLock

相關問題