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