我需要对需要64位和32位进程之间同步的项目实施某种阻塞等待。忙于等待共享内存变量会导致性能/调度问题,并且POSIX信号似乎不支持32位和64位进程之间的IPC。在Linux上是否还有其他低开销的进程间同步替代方案?
答案 0 :(得分:0)
对于使用阻塞等待的进程间同步,简单的解决方案包括named pipe (fd)或System V Semaphore。
Named pipes具有与之关联的文件路径,因此这两个进程可以独立打开文件(一个用于读取,另一个用于写入)。对于纯同步,只需putc()
发出信号,getc()
一次发出一个字符(值无关紧要)。这将创建一个单向(“半双工”)通道;对于双向信号/等待,您将创建两个文件。您甚至可以通过连续执行多个putc()
调用来排队多个信号,有点像永不饱和的信号灯。
System V Semaphores也具有与之关联的文件路径。它们的行为就像Dijkstra信号量。
有关其他选项,请查看
答案 1 :(得分:0)
Linux具有futexes,这是一个内核原语,它为一个进程进入睡眠状态,为另一个进程唤醒提供了一种途径。它们具有非常好的快速路径(在这种情况下,避免内核调用),如果您将它们用作互斥量,则非常重要,而如果将它们用作信号量,则没有太大的作用。
您只需要它的两个最原始的功能。当共享内存中的特定条目具有特定值时,FUTEX_WAIT可使内核进入睡眠状态。另一个是FUTEX_WAKE,它唤醒一个已经通过FUTEX_WAIT进入睡眠状态的进程。
您的“等待”代码将自动检查共享变量以查看其是否需要睡眠,然后仅当共享变量未更改时才调用FUTEX_WAIT进入睡眠状态。您的“唤醒”代码将更改原子共享变量的值,然后调用FUTEX_WAKE唤醒任何正在休眠的线程。
如果您使用64位共享变量,而仅将有意义的数据放在前32位中,则32位/ 64位问题根本没有关系,因此无论是寻址为64位还是相同的变量或32位变量。