C++ linux上的同步,c/c++;

C++ linux上的同步,c/c++;,c++,linux,synchronization,C++,Linux,Synchronization,我将在Linux上同步两个不同的进程。两个进程都希望访问一个设备,一个进程可以同时使用该设备。直到现在,我一直在使用一个命名的信号量进行同步,它运行得很好,直到有人终止了当前在设备上运行的进程。在这种情况下,信号量没有被释放,这将导致尝试获取信号量/访问设备的所有进程挂起 这可以在Windows下通过互斥来简单地解决。在这个系统中,当拥有的线程/进程终止时,命名互斥被自动释放 对于所有关于Linux的评论和/或解决方案,我将不胜感激 提前谢谢! Toreno正如Tony D在之前的评论中所建议的

我将在Linux上同步两个不同的进程。两个进程都希望访问一个设备,一个进程可以同时使用该设备。直到现在,我一直在使用一个命名的信号量进行同步,它运行得很好,直到有人终止了当前在设备上运行的进程。在这种情况下,信号量没有被释放,这将导致尝试获取信号量/访问设备的所有进程挂起

这可以在Windows下通过互斥来简单地解决。在这个系统中,当拥有的线程/进程终止时,命名互斥被自动释放

对于所有关于Linux的评论和/或解决方案,我将不胜感激

提前谢谢!
Toreno

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

#包括
#包括
#包括
类临界截面
{
私人:
字符文件名[fileName_MAX];
int文件描述符;
公众:
临界截面(常量字符*截面名称)
{
//标记为未获得
fileDescriptor=-1;
//生成文件名路径
snprintf(文件名,sizeof(文件名),“/tmp/%s”,sectionName);
}
~CriticalSection()
{
//发布有关删除对象的关键部分
释放();
}
无效获取()
{
//测试是否已获取节
如果(fileDescriptor!=-1)
回来
//获得临界截面
fileDescriptor=open(文件名,O|u CREAT | O|u WRONLY,S|u IRUSR | S|u IWUSR);
如果(fileDescriptor!=-1)
lockf(fileDescriptor,F_LOCK,0);
}
无效释放()
{
//释放临界截面
如果(fileDescriptor!=-1){
关闭(文件描述符);
fileDescriptor=-1;
}
}
};
int main()
{
//创建临界截面
关键章节cs(“myappname”);
//进入关键部分
cs.acquire();
//临界截面代码
printf(“已成功获取关键部分!\n”);
//离开临界截面
cs.release();
返回0;
}
玩得开心,
Toreno

即使其进程被终止,Linux进程也不会得到与WM_CLOSE相同的结果吗?当然,它得到一些信号(除非被杀死9或任何东西(我忘记了Linux是如何工作的,但是没有警告的杀人似乎不太可能))你听说过C++的RAII成语吗?它将帮助你自动关闭/释放你想要的任何东西;有很多方法可以同步(,等等…)建议使用文件锁…
flock()
或任何在进程终止时不会自动清理的东西,并使用一些额外的进程监视您的进程是否已死亡(例如在某些套接字上)并执行清理当然,可以通过调用acquire()简单地修改它以提供RAII函数在构造函数的最后一行。它不需要在末尾使用
cs.release()
,因为析构函数将被自动调用(因为
cs
在堆栈上)。这将只剩下3行:构造
cs
printf
return
,但您将从编译器中得到
未使用的变量
警告。
#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;
}