2010-06-27 54 views
2

在C和C++中编写线程安全的UNIX代码有哪些指导原则?编写线程安全的UNIX代码的提示?

我只知道几个:

  • 不要使用全局
  • 不要使用静态本地存储

是什么人呢?

+0

请标记投票问题的社区wiki'。 – danben 2010-06-27 14:23:18

+0

danben,完成。 s – bodacydo 2010-06-27 14:23:47

回答

6

简单的事情是读一点。以下列表包含一些需要查看和研究的内容。

  1. 花时间阅读的Open Group Base Specification特别是General Information部分和subsection on threads。这是大多数UN * X类似系统下多线程的基本信息。
  2. 学习difference between a mutex and a semaphore
  3. 要认识到,共享MUST来保护这一切。这适用于全局变量,static变量以及任何共享的动态分配的内存。
  4. 将全局状态标志替换为condition variables。这些使用pthread_cond_init和相关功能来实现。

一旦你了解的基础知识,了解常见的问题,这样,当它们出现,你可以识别它们

+0

哇,我基本上没有听说过你在这里列出的任何东西!开始阅读。 – bodacydo 2010-06-27 18:20:10

+0

这里有很多信息。如果你想要更多的书籍,请在https://computing.llnl.gov/tutorials/pthreads/阅读或购买“UNIX系统编程”(http://www.amazon.com/UNIX-Systems-Programming) - 通信并发/ DP/0130424110 /) – 2010-06-29 02:33:32

2

它真的归结为共享状态,全局变量和静态本地都是共享状态的例子。如果你不分享国家,你就不会有问题。共享状态的其他示例包括写入文件或套接字的多个线程。

任何共享资源将需要妥善管理 - 这可能意味着使互斥锁受到保护,打开另一个文件或智能地序列化请求。

如果两个线程正在从同一个结构中读写,那么您需要处理这种情况。

1

谨防sem_t函数,它们可能会返回未完成的中断,IO,SIGCHLD等。如果您需要它们,请务必allways捕获该情况。

pthread_mut_tpthread_cond_t功能相对于EINTR是安全的。

0

一个很好的关于并发性的一般书可以在这里找到:Little Book of Semaphores

它提出了一步一步解决的各种问题,包括常见并发问题的解决方案,如饥饿,竞争条件等。 它不是语言特定的,但包含有关使用Pthread-Library或Python实现C中解决方案的简短章节。