什么是Linux上的gcc相当于微软的关键部分?

时间:2010-08-18 02:23:08

标签: multithreading gcc synchronization posix

Microsoft Visual C ++编译器具有EnterCriticalSectionExitCriticalSection 允许线程之间同步的对象。

GCC的等价物是什么?

我看到__sync_synchronize以及__scoped_lock

附近的引用

事实上,我看到提到了许多原子__sync函数以及许多函数 __atomic个。

我实际上一直在使用__sync_fetch_and_add来进行原子增量 我应该使用__atomic_add_dispatch吗? 有什么区别?

我应该使用哪些?我是否可以在最新版本的GCC和Visual C ++ 2010中使用C ++中的一些构造,因为我将编写一些跨平台代码。

我看到boost有一些功能可用,但出于各种原因我不允许在windows下使用boost。

4 个答案:

答案 0 :(得分:16)

在Linux(和其他Unixen)上,您需要使用PThreads或Posix Threads。没有相当于Windows上的关键部分;使用互斥锁。

编辑:请参阅下面的第一条评论 - 显然Posix Mutexes与Win32 Critical Sections相同,因为它们绑定到一个进程。

答案 1 :(得分:8)

点击此处: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;
}

答案 2 :(得分:2)

EnterCriticalSection,其余的API是Win32 API。就跨平台同步API而言,我认为没有(因为你提到你不能使用boost)。另外,你提到跨平台,这是否意味着不同的架构(对于gcc部分即)。 我已经看到一个大型实现,其中提供了一组通用的API,它们被有条件地编译为具有本机API(如AIX上的fetch_and_add)或使用pthreads Win32 API。 我曾尝试使用posix threads on win32但遇到了一堆问题(但这是一个非常古老的版本)。现在是YMMV。

答案 3 :(得分:2)

如果您只为Windows平台开发程序,我认为最好的方法是使用Win32 API。否则你可以使用Qt C ++库(为此目的,Qt Core就足够了。)

另请参阅:QMutexQMutexLocker 您还可以使用:QReadWriteLock