Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ pthreads中的内存模型规范_C++_C_Multithreading_Pthreads_Shared Memory - Fatal编程技术网

C++ pthreads中的内存模型规范

C++ pthreads中的内存模型规范,c++,c,multithreading,pthreads,shared-memory,C++,C,Multithreading,Pthreads,Shared Memory,对于使用pthreads在一个线程中写入的内存何时在其他线程中可见,是否有任何保证 与Java相比,Java语言规范有一个更好的特性,可以编写可移植的多线程Java代码 是否有相应的pthreads规范 当然,您可以随时让共享数据不稳定,但这不是我想要的 如果这取决于平台,是否存在事实上的标准?还是应该使用另一个线程库?我不知道POSIX线程提供了这样的保证。它们没有原子访问线程共享对象的模型。如果它是针对POSIX线程的,那么对修改可见性的唯一保证就是使用某种锁 现代的C,C11(可能还有C+

对于使用
pthread
s在一个线程中写入的内存何时在其他线程中可见,是否有任何保证

与Java相比,Java语言规范有一个更好的特性,可以编写可移植的多线程Java代码

是否有相应的pthreads规范

当然,您可以随时让共享数据不稳定,但这不是我想要的


如果这取决于平台,是否存在事实上的标准?还是应该使用另一个线程库?

我不知道POSIX线程提供了这样的保证。它们没有原子访问线程共享对象的模型。如果它是针对POSIX线程的,那么对修改可见性的唯一保证就是使用某种锁

现代的C,C11(可能还有C++11)有一个解决这类问题的模型。它有线程和原子(篱笆和所有这些东西),当你假设一个线程所做的修改被另一个线程看到时,它们会给你提供精确的规则

C11的线程接口是POSIX线程的成熟版本,功能较少。不幸的是,该线程接口的语义规范还很松散,基本上在许多地方缺少语义。但是C11接口和POSIX线程语义的结合可以让您很好地了解现代系统中的工作方式


编辑:因此,如果您想保证内存同步,可以使用POSIX提供的锁接口,也可以使用原子操作。所有现代编译器都有提供这些功能的扩展,gcc和系列(icc、opencc、clang)都有内置的
\u sync…
系列。它的最新版本还支持新的C11原子功能。还有一些包装器可以为其他接近
\u Atomic
的编译器提供接口

POSIX在以下位置指定内存模型:

应用程序应确保一个以上的控制线程(线程或进程)对任何内存位置的访问受到限制,以便当另一个控制线程正在修改内存位置时,任何控制线程都不能读取或修改内存位置。这种访问受到限制,使用同步线程执行的函数,并与其他线程同步内存。以下函数与其他线程同步内存:

  • fork()
  • pthread_barrier_wait()
  • pthread_cond_broadcast()
  • pthread_cond_signal()
  • pthread_cond_timedwait()
  • pthread_cond_wait()
  • pthread_create()
  • pthread_join()
  • pthread_mutex_lock()
  • pthread_mutex_timedlock()
  • pthread_mutex_trylock()
  • pthread_mutex_unlock()
  • pthread_spin_lock()
  • pthread_spin_trylock()
  • pthread_spin_unlock()
  • pthread_rwlock_rdlock()
  • pthread_rwlock_timedrdlock()
  • pthread_rwlock_timedwrlock()
  • pthread_rwlock_tryrdlock()
  • pthread_rwlock_trywrlock()
  • pthread_rwlock_unlock()
  • pthread_rwlock_wrlock()
  • 行政长官职位(
  • sem_timedwait()
  • sem_UTRYWAIT()
  • sem_wait()
  • semctl()
  • semop()
  • 等等
  • waitpid()
pthread_once()函数应为给定pthread_once_t对象的每个线程中的第一次调用同步内存

如果互斥类型if pthread_mutex_RECURSIVE且调用线程已经拥有互斥,则pthread_mutex_lock()函数不需要同步内存。如果互斥类型为pthread_mutex_RECURSIVE且互斥锁计数大于1,则pthread_mutex_unlock()函数不需要同步内存

除非另有明确说明,否则如果上述函数之一返回错误,则未指定调用是否导致内存同步

应用程序可能允许多个控制线程同时读取内存位置


如果您使用pthread互斥体或spin互斥体来同步共享数据访问,那么符合标准的Posix+pthreads实现将正常工作。因此,您的意思是,如果我使用任何锁定机制,内存也将在缓存、内核等之间同步。?各种实现是否都指定了这一点?那么您如何处理它呢?我的意思是,在多核系统上运行应用程序而不保证内存是如何同步的,这有点像在冰上行走,不是吗?不。只需遵循有关锁的规则。我不同意规范过于宽松。你会认为委员会的专家知道他们在做什么,事实上这是真的。“松散性”与C中其他未指明的东西一样:因此它可以在各种硬件上实现,而这些硬件与x86完全不同。@ZanLynx,我不同意你关于线程接口的这种特殊情况。该部分有几份缺陷报告有待处理,远远低于该委员会通常的“标准”。POSIX在这方面有大约15年的经验,POSIX文档反映了这一点。放弃所有的经验,选择一个软件供应商的界面和文档,仅仅因为他恰好是委员会的成员,这是一个坏主意。太棒了!非常感谢。这意味着内存模型与Java非常相似:)