我以为我会使用Boost.Interprocess的Message Queue代替套接字在一个主机内进行通信.但是在深入研究之后,似乎这个库出于某种原因避开了POSIX消息队列工具(我的Linux系统支持),而是在POSIX共享内存之上实现.界面足够相似,你可能不会立即猜测,但似乎是这样.
我的缺点是获得的共享内存shm_open(3)似乎不可用select(2),而不是通过获得的POSIX消息队列mq_open(3).
在这种情况下,Boost的图书馆似乎失败了.有谁知道为什么这应该是?即使POSIX消息队列仅在某些系统上可用,我也希望Boost在可用的情况下使用该设施,并且只在必要时重新实现它.POSIX系统是否存在一些我尚未认识到的陷阱?
出于好奇,在Linux上实现进程间同步的首选方法是什么?该sem*(2)系统调用的家人似乎有一个非常笨重,过时的接口,同时有三种方式来锁定文件- fcntl(),flock()和lockf().
有什么内部差异(如果有的话)以及你如何证明每种差异的使用?
我有一个可以由多个线程创建的类.但是在一个函数中需要保护代码,所以我决定使用boost interprocess互斥.每个类在其构造函数中创建或打开相同的Mutex:
MyClass::MyClass()
{
boost::interprocess::named_mutex m_Lock(
boost::interprocess::open_or_create, "myLock" );
}
Run Code Online (Sandbox Code Playgroud)
所以现在有一个关键代码部分被调用的地方:
int MyClass::MyFunction()
{
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> lock(
m_Lock, boost::interprocess::try_to_lock);
if(!lock)
{
return -1;
}
// else do some stuff here
}
Run Code Online (Sandbox Code Playgroud)
要在函数后清理(和它在boost页面上描述的那样),我在我的类析构函数中使用remove命令:
MyClass::~MyClass()
{
boost::interprocess::named_mutex::remove("myLock");
}
Run Code Online (Sandbox Code Playgroud)
实际上所有这些代码都运行良好,但我有一个问题:
正如在remove命令的描述中所说:
从系统中删除命名的互斥锁.错误时返回false.永远不要扔.
所以这意味着删除命令只是将Mutex清除出系统 - 即使另一个线程刚刚锁定它(我已经尝试过这种情况 - 它已经不再被锁定了).所以我的问题如下:例如我有3个线程(A,B和C) - 现在发生以下情况:
所以现在有人可能会说"那就不要打电话了!" - 那可能吗?我的意思是,因为named_mutex写入系统,我怀疑它是否在没有显式调用的情况下被删除,即使程序结束.有人帮忙吗?
我通过使用共享内存在多个进程之间共享一些数据; 我使用进程间互斥来实现同步.
我的问题如下:是否可以使用无锁数据结构和/或原子操作来实现更快的同步,而无需在两个进程之间使用互斥锁?
如果不是,你知道这是什么主要原因?
它们仅用于同步同一进程的线程.这些概念是否也可以移植到流程中?如果不是,您是否知道跨进程共享/同步数据的更快方法?
我正在编写一个C#应用程序,需要与用本机C编写的另一个应用程序进行通信.到目前为止,我已经想出如何使用User32.dll SendMessage将消息从我的C#应用程序发送到C应用程序.但是,我无法弄清楚如何让C#应用程序从C应用程序接收消息.
我已经看到了覆盖WndProc方法的WinForms示例,但是在WPF或Console应用程序中没有要覆盖的WndProc方法.当然,至少可以在控制台应用程序中执行此操作.对?
这是我第一次在这里发帖提问,我通常会在档案中找到答案,但这次我很难过.
我使用来自使用Windows Driver Kit的供应商的一些代码从操纵杆中获取数据.数据采用具有6个元素的数组形式(它是6个自由度的鼠标).
我已经编写了需要抓取数据的代码,而且它是用C++编写的......它使用标准库很多用向量而不是.似乎使用WDK的标准库是一个很大的痛苦,我花了几天试图上班但失败了.我的下一个想法是使用boost :: interprocess,但由于同样的原因,这很难与WDK一起使用.
我想知道是否有办法在C进程和C++进程之间共享内存.我想使用C程序将数组写入内存并从C++程序中读取.它需要发生得非常快,应该有一种方法可以确保我不会在写入(mutex?)中读取它.
欢迎任何想法或建议.
编辑 我做了一个DLL,现在我只有一个DLL,它有一个getValues()函数,我可以从我的C++项目调用.我不得不使用pimpl成语来隐藏c的东西.谢谢你的帮助!
目前,我在我的应用程序中使用EventEmitter2作为消息总线,我真的很喜欢它.
无论如何,现在我需要一个消息总线,它不仅可以在进程中工作,还可以在进程间工作.我理想的候选人会......
我该怎么办没有需要:
任何想法或提示?
PS:如果你可以推荐一款可用的产品,这很好,但是如果你可以指引我自己做一个无服务器的方向,也没关系.
目前我正在使用C++将软件从Windows移植到Mac OS X.
在Windows中,全局名为mutex的状态为废弃状态,这意味着互斥锁的当前所有者进程在不释放互斥锁的情况下消失.(这可能是由应用程序崩溃引起的)
由于存在废弃状态,试图锁定被遗弃的互斥锁不会造成死锁.
如果没有废弃的状态,它将永远等待不属于任何人的互斥锁.
还有另一种方法是使用超时来假设如果无法在一定时间内获得互斥锁而放弃互斥锁,但与废弃的互斥方式相比,它并不是一个完美的解决方案.在最坏的情况下,意外地两个进程可以访问由互斥锁锁定的对象.
在Mac OS X/Linux中是否有任何互斥支持被放弃的状态?
我研究了boost库,boost库有一个名为mutex,但是那个基于共享文件,所以它没有放弃状态.
请给我一些建议.
我需要在C#应用程序之间实现进程间通信.我决定使用命名管道并编写以下代码:
服务器
while (true)
{
using (var server = new NamedPipeServerStream("some_pipe"))
{
server.WaitForConnection();
using (var reader = new StreamReader(server))
{
string line = reader.ReadLine();
MessageBox.Show(line);
}
}
}
Run Code Online (Sandbox Code Playgroud)
客户
using (var client = new NamedPipeClientStream("some_pipe"))
{
client.Connect();
using (var writer = new StreamWriter(client))
{
writer.AutoFlush = true;
writer.WriteLine(path);
client.WaitForPipeDrain();
}
}
Run Code Online (Sandbox Code Playgroud)
我有以下问题:
NamedPipeServerStream每次都真正创建另一个类实例吗?如果我从while (true)循环移动它的结构,它给我一个例外"无法访问一个封闭的管道".我怎么能避免呢?如果我无法避免它并且每次都应该重新创建这个对象,那么NamedPipeServerStream当客户端尝试连接它时会发生什么?