Linux中与Windows关键部分相当的是什么?

13
Windows NT操作系统有EnterCriticalSectionExitCriticalSection对象,用于线程之间的同步。
在使用GCC编译器的Linux中,有什么等效的方法?
我看到有关__sync_synchronize__scoped_lock的参考。
实际上,我看到了一些原子__sync函数以及一些__atomic函数的提及。
我一直在使用__sync_fetch_and_add进行原子递增,我应该使用__atomic_add_dispatch吗? 它们有什么区别?
我应该使用哪些函数?在最新版本的GCC和Visual C++ 2010中,是否有一些C++构造可以在两个平台上使用?因为我将要编写一些跨平台代码。
我看到Boost有一些可用的函数,但由于各种原因,我不被允许在Windows下使用Boost。

我猜你也不能使用其他的库了吧?Qt有一个不错(跨平台)的线程API。 - mtvec
4个回答

22

在Linux(和其他Unix系统)中,您需要使用PThreads或Posix线程。Windows上没有与临界区等价的东西;请使用Mutex代替。

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


8
实际上,POSIX 互斥锁与 Win32 关键段(进程限定)等效;Win32 互斥锁不同于关键段,因为它们是跨进程的。 - MSalters
1
@MSalters,此外,Win32临界区比Win32互斥量快得多,因为它们是在用户空间中实现的,不涉及与系统调用相关的开销。但我不知道Posix互斥量怎么样? - Tanuj
4
我进行了一些测试,在许多线程的重度竞争条件下,Windows的临界区比Linux的互斥锁显著更快。 - Arsen Zahray
3
@Arsen:不管怎样都不会让我感到惊讶。根据我的(非常有限的)理解,它们在底层实现上是不同的机制。我知道 Windows 的开发人员花了很多时间来优化锁的行为方式。 - Billy ONeal
Linux有futexs,它们位于用户空间中,比mutexs更快。我不知道这些速度与Win32关键部分相比如何。 - floomby
显示剩余3条评论

10

请查看: 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
如果您只开发Windows平台的程序,我认为最好的方法是使用Win32 API。否则,您可以使用Qt C++库(对于此目的,Qt Core已足够)。
另请参阅:QMutexQMutexLocker。您还可以使用:QReadWriteLock

2

EnterCriticalSection和其他API都是Win32 API。就跨平台同步API而言,我认为没有任何API(因为您提到不能使用boost)。另外,您提到了跨平台,这是否也意味着不同的体系结构(例如gcc部分)。 我曾经见过一个大型实现,其中提供了一组常用的API,这些API将有条件地编译为本机API(例如在AIX上的fetch_and_add)或使用pthread Win32 API。 我曾经尝试在win32上使用posix线程,但遇到了一堆问题(但那是一个非常旧的版本)。现在可能会有所不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接