【问题标题】:Exclusive access to resource from multiple threads多线程独占访问资源
【发布时间】:2011-06-16 05:02:26
【问题描述】:

对于线程,是否有与 SIGSTOP 和 SICONT 等价的东西?我正在使用 pthreads。 谢谢

编辑: 我正在线程之间实现一种粗略的文件访问同步形式。因此,如果一个文件已经被一个线程打开,并且另一个线程想要再次打开它,我需要在第二个线程的执行点暂停或暂停第二个线程。当第一个线程完成其工作时,它将检查其他线程想要使用它释放的文件并“唤醒”它们。然后第二个线程从该点恢复执行。我使用自己的簿记数据结构。

【问题讨论】:

    标签: c linux pthreads signals


    【解决方案1】:

    我将告诉你如何做事,而不是回答问题。 (查找“X Y 问题”。)

    您正试图阻止两个线程同时访问同一个文件。换句话说,访问是互斥的。 “互斥锁”旨在做到这一点。一般来说,如果您搜索您正在尝试做的事情(防止两个线程同时访问同一资源)而不是搜索您想要如何做(让一个线程等待另一个),则更容易找到帮助。

    编辑:听起来您实际上想要很多读者,但只有一位作者。这可能是第二个最常见的同步问题(在“生产者-消费者”问题之后)。使用pthread_rwlock:读者调用pthread_rdlock,作者调用pthread_wrlock

    如果您正在做如此复杂的事情,您真的应该开始阅读相关文献。如果你认为你可以认真阅读多线程编程,那你比我聪明得多,你不需要我的帮助。我推荐免费下载的“信号量小书”(source)。这与 pthread 无关,但它是好东西。您要询问的读者-作者问题在“经典同步问题”一章的第 4.2 节中找到(见鬼,这个问题甚至在简介中提到)。

    多线程编程是HARD大写字母和粗体。

    【讨论】:

    • 非常感谢。但是,它稍微复杂一点。我允许许多读者同时访问该文件,但只有一个作者,并且可能有多个线程等待访问文件。所以有一个队列。
    • @Juggler:那么你想要的是一个readers/writer lock,它是每个现代线程库都提供的;例如pthread version。编辑:Dietrich 打败了我 :-)
    • 顺便说一句。没有“粗略”同步之类的东西。只有“正确”和“错误”的同步……
    • 谢谢...我知道所涉及的困难,但我必须这样做,并且还要在特定的指定时间内完成。感谢您的指点
    【解决方案2】:

    嗯,有pthread_kill

    但您几乎可以肯定不想这样做。如果另一个线程持有(例如)堆的互斥体,而您尝试在它停止时调用 new 怎么办?

    由于您不知道运行时对互斥体做了什么,因此除非您完全避免使用标准库,否则一般无法避免此类问题。

    [编辑]

    实际上,想一想,如果您使用SIGSTOP 定位特定线程,我不确定会发生什么,因为该信号通常会影响整个进程。

    所以更新我的答案,我不相信有任何标准机制可以异步挂起线程......由于上述原因,我认为你不想要一个。

    【讨论】:

      【解决方案3】:

      根据您的应用程序,Pthreads 支持可以被认为更精细的机制,例如 http://www.unix.com/man-page/all/3t/pthread_suspend/ 和 Mutex 机制

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-02
        • 2013-01-20
        • 2013-11-07
        • 1970-01-01
        • 1970-01-01
        • 2019-10-28
        相关资源
        最近更新 更多