C++ 在用户模式下从另一个进程回调,不带额外线程

C++ 在用户模式下从另一个进程回调,不带额外线程,c++,c,winapi,C++,C,Winapi,我想知道是否有人熟悉用户模式下的同步机制,通过这种机制,一个应用程序可以注册一个“回调”函数,当另一个应用程序发出信号时,该函数将被调用我不介意回调处于仲裁线程中。 假设我有很多并行的“工作”进程,其中一个想要通知它们一个更改(不需要付费数据),每个进程都必须进行一些内部更新 实现这一点的直接方法是在每个线程中创建另一个线程,并拥有一个无限循环,该循环等待一个全局事件,然后立即调用回调函数。要发出这一信号,一个进程只需要发出这一全球事件的信号 问题是,在这个项目中,我会有很多并行进程,我不想仅仅

我想知道是否有人熟悉用户模式下的同步机制,通过这种机制,一个应用程序可以注册一个“回调”函数,当另一个应用程序发出信号时,该函数将被调用我不介意回调处于仲裁线程中。

假设我有很多并行的“工作”进程,其中一个想要通知它们一个更改(不需要付费数据),每个进程都必须进行一些内部更新

实现这一点的直接方法是在每个线程中创建另一个线程,并拥有一个无限循环,该循环等待一个全局事件,然后立即调用回调函数。要发出这一信号,一个进程只需要发出这一全球事件的信号

问题是,在这个项目中,我会有很多并行进程,我不想仅仅为了实现这一点而向系统中添加thread*n进程,即使它们大部分是暂停的

我发现目前的“解决办法”是保留我自己的“虚拟”注册表项,每个进程都将“注册注册表通知回调”,当一个应用程序想要通知其他应用程序时,它只会触发对该注册表项的写入。。。windows将回调每个注册到此通知的进程


还有其他想法吗

更好的解决方案是使用共享管道,它不会污染注册表。所有工作进程都可以连接到命名管道服务器,并执行异步读取。当服务器想要踢工人时,它只写一个字节。这将触发工作人员的完成例程


不过,此通知与大多数其他Windows通知具有相同的缺点。如果您的所有工作线程都在运行工作代码,那么您的通知不会到达任何线程,而且您也没有为此创建特殊线程。唯一的解决方案是
CreateRemoteThread
,但这是一个很大的难题。

更好的解决方案是使用共享管道,它不会污染注册表。所有工作进程都可以连接到命名管道服务器,并执行异步读取。当服务器想要踢工人时,它只写一个字节。这将触发工作人员的完成例程


不过,此通知与大多数其他Windows通知具有相同的缺点。如果您的所有工作线程都在运行工作代码,那么您的通知不会到达任何线程,而且您也没有为此创建特殊线程。唯一的解决方案是
CreateRemoteThread
,但这是一个非常大的难题。

谢谢大家的有用想法

最后,我无意中遇到了一个似乎就是这样的人


我仍然在考虑@MSalters关于在给定时间内没有足够的空闲工作线程的评论,因为我假设此回调机制依赖于大多数Win32API使用的相同回调机制

谢谢大家的有用想法

最后,我无意中遇到了一个似乎就是这样的人


我仍然在考虑@MSalters关于在给定时间内没有足够的空闲工作线程的评论,因为我假设此回调机制依赖于大多数Win32API所使用的相同回调机制

它们可以检查互斥状态,而互斥状态不会;我不必阻塞。或者每个线程都可以运行一个消息循环,您可以使用
SendThreadMessage()
我想您可以使用异步管道设计一些客户机/系统模型。但这会给程序增加很多复杂性。如果只有一个信号,并且您不太可能将IPC扩展到这个信号之外,那么您可能会选择更简单的方法,比如您的寄存器解决方案。您可以将此功能添加到已经存在的线程中吗?一个额外的输入信号或Windows的“WM_COPYDATA”消息?它们可以检查互斥状态,而互斥状态不会改变;我不必阻塞。或者每个线程都可以运行一个消息循环,您可以使用
SendThreadMessage()
我想您可以使用异步管道设计一些客户机/系统模型。但这会给程序增加很多复杂性。如果只有一个信号,并且您不太可能将IPC扩展到这个信号之外,那么您可能会选择更简单的方法,比如您的寄存器解决方案。您可以将此功能添加到已经存在的线程中吗?额外的输入信号或Windows“WM_COPYDATA”消息?