Microsoft Visual C ++编译器具有EnterCriticalSection
和ExitCriticalSection
允许线程之间同步的对象。
GCC的等价物是什么?
我看到__sync_synchronize
以及__scoped_lock
事实上,我看到提到了许多原子__sync
函数以及许多函数
__atomic
个。
我实际上一直在使用__sync_fetch_and_add
来进行原子增量
我应该使用__atomic_add_dispatch
吗?
有什么区别?
我应该使用哪些?我是否可以在最新版本的GCC和Visual C ++ 2010中使用C ++中的一些构造,因为我将编写一些跨平台代码。
我看到boost有一些功能可用,但出于各种原因我不允许在windows下使用boost。
答案 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就足够了。)
另请参阅:QMutex和QMutexLocker 您还可以使用:QReadWriteLock