自学内容网 自学内容网

windows C++ 并行编程-异步消息块(二)

overwrite_buffer 类

concurrency::overwrite_buffer 类与 unbounded_buffer 类类似,只不过 overwrite_buffer 对象仅存储一条消息。 此外,当目标接收来自 overwrite_buffer 对象的消息时,不会从缓冲区中删除该消息。 因此,多个目标将接收到该消息的副本。

如果你要将多条消息传递到另一个组件,而该组件只需要最新的值,则 overwrite_buffer 类很有用。 需向多个组件广播消息时,此类也很有用。

示例

以下示例使用基本结构来演示如何使用 overwrite_buffer 类。 此示例将三个值发送到 overwrite _buffer 对象,然后从该对象读取当前值三次。 此示例类似于 unbounded_buffer 类的示例。 但是,overwrite_buffer 类仅存储一条消息。 此外,运行时不会在读取消息后从 overwrite_buffer 对象中删除该消息。

// overwrite_buffer-structure.cpp
// compile with: /EHsc
#include <agents.h>
#include <iostream>

using namespace concurrency;
using namespace std;

int wmain()
{
   // Create an overwrite_buffer object that works with
   // int data.
   overwrite_buffer<int> item;

   // Send a few items to the overwrite_buffer object.
   send(item, 33);
   send(item, 44);
   send(item, 55);

   // Read the current item from the overwrite_buffer object and print
   // it to the console three times.
   wcout << receive(item) << endl;
   wcout << receive(item) << endl;
   wcout << receive(item) << endl;
}

该示例产生下面的输出:

555555
single_assignment 类

concurrency::single_assignment 类与 overwrite_buffer 类类似,只不过只能写入到 single_assignment 对象一次。 与 overwrite_buffer 类相似,在目标收到来自 single_assignment 对象的消息时,不会从该目标删除此消息。 因此,多个目标将接收到该消息的副本。 如果你要向多个组件广播一条消息时,single_assignment 类很有用。

示例

以下示例使用基本结构来演示如何使用 single_assignment 类。 此示例将三个值发送到 single_assignment 对象,然后从该对象读取当前值三次。 此示例类似于 overwrite_buffer 类的示例。 尽管 overwrite_buffer 和 single_assignment 类都存储一条消息,但只能写入到 single_assignment 类一次。

// single_assignment-structure.cpp
// compile with: /EHsc
#include <agents.h>
#include <iostream>

using namespace concurrency;
using namespace std;

int wmain()
{
   // Create an single_assignment object that works with
   // int data.
   single_assignment<int> item;

   // Send a few items to the single_assignment object.
   send(item, 33);
   send(item, 44);
   send(item, 55);

   // Read the current item from the single_assignment object and print
   // it to the console three times.
   wcout << receive(item) << endl;
   wcout << receive(item) << endl;
   wcout << receive(item) << endl;
}

该示例产生下面的输出:

333333
call 类

concurrency::call 类充当消息接收方,它在接收数据时执行工作函数。 此工作函数可以是 lambda 表达式、函数对象或函数指针。 call 对象的行为与普通函数调用不同,因为它与向它发送消息的其他组件并行运行。 如果 call 对象在接收消息时正在执行工作,则它会将该消息添加到队列。 每个 call 对象按消息的接收顺序处理排队的消息。

示例

以下示例使用基本结构来演示如何使用 call 类。 此示例创建一个 call 对象,它会将收到的每个值输出到控制台。 然后,该示例将三个值发送到 call 对象。 由于 call 对象在单独的线程上处理消息,因此此示例还使用了计数器变量和 event 对象来确保 call 对象在 wmain 函数返回之前处理所有消息。

// call-structure.cpp
// compile with: /EHsc
#include <agents.h>
#include <iostream>

using namespace concurrency;
using namespace std;

int wmain()
{
   // An event that is set when the call object receives all values.
   event received_all;

   // Counts the 
   long receive_count = 0L;
   long max_receive_count = 3L;

   // Create an call object that works with int data.
   call<int> target([&received_all,&receive_count,max_receive_count](int n) {
      // Print the value that the call object receives to the console.
      wcout << n << endl;
      
      // Set the event when all messages have been processed.
      if (++receive_count == max_receive_count)
         received_all.set();
   });

   // Send a few items to the call object.
   send(target, 33);
   send(target, 44);
   send(target, 55);

   // Wait for the call object to process all items.
   received_all.wait();
}

该示例产生下面的输出: 

334455

原文地址:https://blog.csdn.net/m0_72813396/article/details/141748596

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!