【问题标题】:fcntl() for thread or process synchronization?fcntl() 用于线程或进程同步?
【发布时间】:2010-12-18 10:17:23
【问题描述】:

是否可以对文件使用 fcntl() 系统调用来实现线程/进程同步(而不是信号量)?

【问题讨论】:

  • 您为什么要这样做?有关您要完成的工作的更多信息会有所帮助。

标签: c++ c synchronization semaphore fcntl


【解决方案1】:

是的。 Unix fcntl 锁(和一般的文件系统资源)是系统范围的,因此任何两个执行线程(无论它们是否是独立的进程)都可以使用它们。这是否是一个好主意取决于上下文。

【讨论】:

  • 谢谢,我的问题不是我是否想这样做,而是它是否可能。事实证明,是的,这是可能的。再次感谢。
【解决方案2】:

这是进程之间同步的一种方式,但如果您不想使用信号量,则可以使用进程共享互斥锁,例如在基于 POSIX 的平台上使用PTHREAD_PROCESS_SHARED 属性创建的互斥锁和条件变量(请参阅@987654321 @ 和 pthread_condattr_setpshared())。另一种选择是使用基于事件的 IPC(套接字等)机制,该机制会阻塞直到您定义的事件被解复用(例如,通过 select())。还有其他几个基于共享内存的选项。

但是,由于您使用的是 C++,我建议您使用 C++ 框架,该框架可以极大地简化这种跨多个平台的进程间同步,例如 boost.interprocessACE

【讨论】:

    【解决方案3】:

    fcntl和flock不是用于线程的,而是用于进程的,所以不能用于线程同步。

    【讨论】:

    • fcntl 具有多线程错误死锁检查(设计缺陷)。想想这样的场景,两个进程都有两个线程。线程 1 看起来像:for(;;) {fcntl_auto_lock(file1);}。线程 2 看起来像:for(;;) {fcntl_auto_lock(file2);}。 fcntl 将返回 EDEADLK(35) 这里可以找到更多细节:bugzilla.mozilla.org/show_bug.cgi?id=62457#c5
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    相关资源
    最近更新 更多