Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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++ 使用派生类强制转换通用队列元素和进程事件_C++_Multithreading_Queue - Fatal编程技术网

C++ 使用派生类强制转换通用队列元素和进程事件

C++ 使用派生类强制转换通用队列元素和进程事件,c++,multithreading,queue,C++,Multithreading,Queue,我有一个主线程做一些工作,它异步地委托另一个线程向另一个进程发送一些数据 我使用了一个通用的shared_ptr(T)队列,主线程推入队列,第二个线程弹出数据并处理它 I推送从T派生的许多数据类型(即共享的ptr(A)、共享的ptr(B)) class A : public T{}; class B : public T{}; 从泛型类型中了解派生类的最佳方法(有效)是什么 PS:动态强制转换不是最好的解决方案。 生产者发送数据类型。 使用者弹出队列并根据传递的数据执行其工作。 使用者在调用给

我有一个主线程做一些工作,它异步地委托另一个线程向另一个进程发送一些数据

我使用了一个通用的shared_ptr(T)队列,主线程推入队列,第二个线程弹出数据并处理它

I推送从T派生的许多数据类型(即共享的ptr(A)、共享的ptr(B))

class A : public T{};
class B : public T{};
从泛型类型中了解派生类的最佳方法(有效)是什么

PS:动态强制转换不是最好的解决方案。 生产者发送数据类型。 使用者弹出队列并根据传递的数据执行其工作。 使用者在调用给定函数时使用此数据。 使用者应检测所传递参数的派生类,以委托适当的函数调用

void process(shared_ptr<T> ptr)
{
if (type(ptr) == A) do work using A..
if (type(ptr) == B) do staff using B..
...
}
void流程(共享)
{
如果(类型(ptr)=A)使用..进行工作。。
如果(类型(ptr)=B)员工使用B。。
...
}

感谢您的帮助和时间。

作为对
std::shared\u ptr
的实例进行排队的替代方法,您可以对可调用类型的实例进行排队,例如

假设所讨论的两个函数是
dou-work
dou-stuff
,那么客户端代码将是

auto dataA = std::make_shared<A>(...);
queue.enqueue([dataA]()
              {
                  do_work(dataA);
              });
auto dataB = std::make_shared<B>(...);
queue.enqueue([dataB]()
              {
                  do_stuff(dataB);
              });

离题,但。。。为什么事情会这样?为什么不只拥有一个
std::function
实例队列?客户机代码将任务推送到队列中,消费者只需退出队列并调用它们。感谢您的回复,我有数据要从一个线程传递到另一个线程。并且,可以通过用于初始化
std::function
的,我不明白你在说什么。我想用参数数据运行methode f()。然后请编辑你的问题,以澄清你想做什么,以及这些额外参数来自何处。如果消费者执行f(),它将调用do_work(dataA),例如?这是正确的。要调用的函数和要作为参数传递的数据都可以使用lambda打包。
if (type(ptr) == A) do work using A..
if (type(ptr) == B) do staff using B..
auto dataA = std::make_shared<A>(...);
queue.enqueue([dataA]()
              {
                  do_work(dataA);
              });
auto dataB = std::make_shared<B>(...);
queue.enqueue([dataB]()
              {
                  do_stuff(dataB);
              });
while (true) {
    try {

        /*
         * Dequeue the next task.
         */
        auto f = queue.dequeue();

        /*
         * Run it.
         */
        f();
    catch (...) {

        /*
         * Handle errors here.
         */
    }
}