gcc 什么是Linux的Windows临界区等价物?

jgzswidk  于 2023-10-19  发布在  Linux
关注(0)|答案(4)|浏览(109)

Windows NT操作系统具有EnterCriticalSectionExitCriticalSection对象,以允许线程之间的同步。
在使用GCC编译器时,Linux的等价物是什么?
我看到对__sync_synchronize的引用沿着还有__scoped_lock
事实上,我看到提到了一些原子__sync函数,沿着一些__atomic函数。
我实际上一直在使用__sync_fetch_and_add作为原子增量,我应该使用__atomic_add_dispatch吗?
有什么区别吗?
我应该用哪一个?C中是否有一些结构可以在最新版本的GCC和Visual C 2010中使用,因为我将编写一些跨平台代码。
我看到boost有一些可用的功能,但由于各种原因,我不允许在windows下使用boost。

dddzy1tm

dddzy1tm1#

在Linux(和其他Unixen)上,你需要使用PThreads或Posix Threads。Windows上没有与Critical Sections等同的内容;使用Mutex。
编辑:参见下面的第一条评论--显然Posix Mutexes与Win32 Critical Sections相同,因为它们被绑定到单个进程。

uqjltbpv

uqjltbpv2#

点击这里: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;
}
anauzrmj

anauzrmj3#

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

zc0qhyus

zc0qhyus4#

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

相关问题