在 Linux、C/C++ 上同步
synchronization on linux, c/c++
我将在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;
}
玩得愉快托雷诺
相关文章:
- 松弛原子与无同步情况下的记忆连贯性
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中同步线程
- 与 stdio 同步是否使程序 I/O 非交互式?
- 如何在qt中同步应用程序和显示器的刷新率?
- Windows 进程间同步类似事件?
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 将 10 个线程与原子布尔值同步
- ofstream::close() 是否在 Linux 上调用同步?
- 与Visual Studios(c ++)同步时如何组织github存储库?
- 原子获取是否与互斥锁释放同步?
- Boost (Beast) websocket:同步写入挂起
- Postgres vs MySQL:命令不同步;.
- 线程过程中的线程同步问题
- 同步读取多个 TCP 响应
- 同步两个具有不同帧速率的传感器
- 如何定期同步线程?
- 同步对多个向量进行排序
- 同步类中的公共变量
- 如何检查 ntpd 是否仍在运行和同步