在 Linux、C/C++ 上同步

synchronization on linux, c/c++

本文关键字:C++ 同步 Linux      更新时间:2023-10-16

我将在Linux上同步两个不同的进程。两个进程都希望访问一个设备,该设备可以由一个进程同时使用。到目前为止,我一直使用命名的信号量进行同步,并且运行良好,直到有人杀死当前在设备上运行的进程。在这种情况下,信号灯不会被释放,这导致所有试图获取信号量/访问设备的进程挂起。

这可以在具有互斥锁的Windows下简单解决。在此系统中,当拥有线程/进程终止时,会自动释放命名互斥锁。

我将不胜感激Linux上的所有评论和/或解决方案。

提前感谢!托雷诺

我按照 Tony D 在之前的评论中建议使用 flock 解决了这个问题。如果有人想在将来使用它,这是我的代码:)

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
class CriticalSection
{
    private:
        char fileName[FILENAME_MAX];
        int fileDescriptor;

    public:
        CriticalSection(const char *sectionName)
        {
            // Mark as not acquired
            fileDescriptor = -1;
            // Build file name path
            snprintf(fileName, sizeof(fileName), "/tmp/.%s", sectionName);
        }
        ~CriticalSection()
        {
            // Release critical section on object deletion
            release();
        }
        void acquire()
        {
            // Test if section is already acquired
            if(fileDescriptor != -1)
                return;
            // Acquire critical section
            fileDescriptor = open(fileName, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR); 
            if(fileDescriptor != -1)
                lockf(fileDescriptor, F_LOCK, 0);
        }
        void release()
        {
            // Release critical section
            if(fileDescriptor != -1) {
                close(fileDescriptor);
                fileDescriptor = -1;
            }
        }
};
int main()
{
    // Create critical section
    CriticalSection cs("myappname");
    // Enter crtitical section
    cs.acquire();
    // Critical section code
    printf("Critical section has been acquired successfully!n");
    // Leave critical section
    cs.release();
    return 0;
}

玩得愉快托雷诺