Multithreading 什么是linux上的gcc';相当于微软';什么是关键部分? 退出临界段< /代码> 对象以允许线程之间的同步
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的最新版本中使用,因为我将编写一些跨平台代码。
\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;
}