【问题标题】:Tips to write thread-safe UNIX code?编写线程安全的 UNIX 代码的技巧?
【发布时间】:2011-03-08 20:16:02
【问题描述】:

用 C 和 C++ 编写线程安全的 UNIX 代码的准则是什么?

我只知道几个:

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

还有哪些?

【问题讨论】:

  • 请将投票问题标记为“社区维基”。

标签: c unix multithreading thread-safety


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    1. 花时间阅读Open Group Base Specification,尤其是General Information部分和subsection on threads。这是大多数 UN*X 系统下多线程的基础信息。
    2. 了解difference between a mutex and a semaphore
    3. 意识到共享的所有内容必须受到保护。这适用于全局变量、static 变量和任何共享的动态分配内存。
    4. condition variables 替换全局状态标志。这些是使用pthread_cond_init 和相关函数实现的。

    了解基础知识后,了解常见问题,以便您在何时识别它们:

    【讨论】:

    【解决方案3】:

    注意sem_t 函数,它们可能会在中断、IO、SIGCHLD 等上返回未完成。如果您需要它们,请务必始终捕获这种情况。

    pthread_mut_tpthread_cond_t 函数相对于 EINTR 是安全的。

    【讨论】:

      【解决方案4】:

      真正归结为共享状态,全局变量和静态局部变量是共享状态的示例。如果您不共享状态,则不会有问题。共享状态的其他示例包括多个线程写入文件或套接字。

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

      如果两个线程从同一个结构读取和写入,您需要处理这种情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-03
        • 1970-01-01
        • 2013-02-22
        • 1970-01-01
        相关资源
        最近更新 更多