Multithreading 什么是linux上的gcc';相当于微软';什么是关键部分? 退出临界段< /代码> 对象以允许线程之间的同步

Multithreading 什么是linux上的gcc';相当于微软';什么是关键部分? 退出临界段< /代码> 对象以允许线程之间的同步,multithreading,gcc,synchronization,posix,Multithreading,Gcc,Synchronization,Posix,GCC的等价物是什么 我看到有关\uuuuu sync\u synchronize以及\uuuu scoped\u lock 事实上,我看到人们提到了许多原子的\uuu sync函数以及一些 原子的 实际上,我一直在使用\uuuu sync\ufetch\u和\uadd作为我的原子增量 我应该改用\uuuuuuuuuuuuu原子\uu添加\uu调度吗? 有什么区别 我应该用哪一种?是否有一些C++结构,我可以在GCC和Visual C++ 2010的最新版本中使用,因为我将编写一些跨平台代码。

GCC的等价物是什么

我看到有关
\uuuuu sync\u synchronize
以及
\uuuu scoped\u lock

事实上,我看到人们提到了许多原子的
\uuu sync
函数以及一些 原子的

实际上,我一直在使用
\uuuu sync\ufetch\u和\uadd
作为我的原子增量 我应该改用
\uuuuuuuuuuuuu原子\uu添加\uu调度
吗?
有什么区别

我应该用哪一种?是否有一些C++结构,我可以在GCC和Visual C++ 2010的最新版本中使用,因为我将编写一些跨平台代码。 我知道boost有一些可用的功能,但由于各种原因,我不允许在windows下使用boost。

在Linux(和其他Unixen)上,您需要使用PThreads或Posix线程。窗户上没有与临界截面等效的构件;改用互斥锁


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

EnterCriticalSection
,其余的API都是Win32 API。至于跨平台同步API,我认为没有(因为您提到不能使用boost)。此外,您提到了跨平台,这是否也意味着不同的体系结构(对于gcc部分,即)。 我见过一个大型实现,其中提供了一组通用的API,这些API被有条件地编译为具有本机API(如AIX上的fetch_和_add),或者使用pthreads作为Win32 API。 我曾经尝试使用,但遇到了一系列问题(但这是一个非常旧的版本)。现在请点击这里:

/*示例C/C++,Unix/Linux*/
#包括
/*这是临界截面对象(静态分配)*/
静态pthread\u mutex\u t cs\u mutex=pthread\u RECURSIVE\u mutex\u INITIALIZER\u NP;
void f()
{
/*进入临界区——其他线程被锁定*/
pthread_mutex_lock(&cs_mutex);
/*做一些线程安全处理*/
/*离开临界区——其他线程现在可以pthread_mutex_lock()*/
pthread_mutex_unlock(&cs_mutex);
}
int main()
{
f();
返回0;
}

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

我想您也不能使用其他库了吧?Qt有一个很好的(跨平台)线程API。实际上,POSIX互斥体相当于Win32关键部分(进程限制);Win32互斥体在跨进程方面与关键部分不同。@MSalters:Ah——我不知道这一点。必须打破术语重用。@此外,Win32 Critical Section比Win32 Mutex快得多,因为它们是在用户空间中实现的,不涉及与系统调用相关的开销。不过我不知道Posix互斥体是什么?我做了一些测试,在许多线程激烈竞争的情况下,windows的关键部分要比linux快得多mutex@Arsen:无论如何我都不会感到惊讶。据我(非常有限)的理解,他们是不同的动物。我知道Windows人员花了很多时间优化锁的行为方式。
/* 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;
}