Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何编写函数<;void()>;到管道/承插副?_C++_Functional Programming_Pipe - Fatal编程技术网

C++ 如何编写函数<;void()>;到管道/承插副?

C++ 如何编写函数<;void()>;到管道/承插副?,c++,functional-programming,pipe,C++,Functional Programming,Pipe,需要将std::function发送到管道/插座内的螺纹。写入套接字非常重要,因为我正在使用pollfd检查是否有东西写入了调用队列。现在我使用的是std::queue,但它不能通知我的主线程写了什么。有没有一种方法可以使用std::queue触发pollfd?或者有没有一种方法可以将std::function写入套接字/管道?您的操作稍微有点倒退 您不会向线程“发送”队列或函数。您通知线程有一些工作要做;然后,在该线程上运行的代码继续检查一些共享的东西(您的队列),并在执行相应的同步任务(互斥

需要将std::function发送到管道/插座内的螺纹。写入套接字非常重要,因为我正在使用pollfd检查是否有东西写入了调用队列。现在我使用的是std::queue,但它不能通知我的主线程写了什么。有没有一种方法可以使用std::queue触发pollfd?或者有没有一种方法可以将std::function写入套接字/管道?

您的操作稍微有点倒退

您不会向线程“发送”队列或函数。您通知线程有一些工作要做;然后,在该线程上运行的代码继续检查一些共享的东西(您的队列),并在执行相应的同步任务(互斥对象!)后提取出它需要处理的任何东西(例如,新推送的函数对象)

如果您已经在使用套接字(并且您在兼容的平台上),它非常适合此任务,因为它为您提供了一个FD,您可以在现有的
选择
/
轮询
/
epoll
循环中查看该FD;然后,只要您愿意,就可以从想要创建通知的线程中触发它

否则,条件变量对于跨线程发送信号非常有用


主线
  • 就FDs上的活动进行投票
  • 在FD上找到活动时:
    • 是我的“队列具有新功能”事件FD吗?
      • 锁定队列
      • 弹出新函数
      • 解锁队列
      • 调用函数(或您需要执行的任何操作)
提供者线程
  • 锁定队列
  • 推动新功能
  • 解锁队列
  • 触发“队列具有新功能”事件FD

从技术上讲,您可以序列化指向函数对象的指针,并通过诚实可靠的套接字(仅在同一个程序中!)发送生成的字节,然后将收到的字节重新解释为指针,取消对指针的引用,调用函数


但这将是一个真正的混乱,并导致生命周期管理的复杂性,而不是事情的处理方式。

听起来像是您想要使用一个文件描述符来纯粹用于通知。Linux有一个特点:你的意思是编写调用套接字时函数返回的任何内容?不,我有一个运行自己循环的应用程序。我可以使用轮询回调在这个循环中插入调用。我需要使用fd将函数发送到此线程,以触发运行我的函数任务的函数。Botje是正确的。使用这种机制通知其他线程“等待发生的事情”。您不需要“使用std::queue”或“编写std::function”-这些是在观察到通知后需要检查的内容。不,您不需要。这就是你认为的解决方案,而不是你想做的:)eventfd是否需要包装为互斥锁/解锁?@TwaikYont我将把研究eventfd的使用作为练习留给读者。下面是一些让您开始学习的内容:值得一提的是,这正是我实现框架的消息传递和计时器机制的方式,它与I/O处理一起工作得非常好。