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_Static_Pthreads - Fatal编程技术网

C++ 在构造函数内创建线程

C++ 在构造函数内创建线程,c++,multithreading,static,pthreads,C++,Multithreading,Static,Pthreads,因此,我使用C++11,并创建了一个类 C类 { 私人: 排队等候; pthread_t x; 公众: C(){phthread_create(&x,NULL,d_q,NULL); void log(int p);//推入q。 void*d_q(void*q);//这是一个将弹出s的函数。假设s是线程安全的。 } 问题是行pthread\u create(&x,NULL,d\u q,NULL)。它给了我错误:必须调用对非静态成员的引用。 我通过使pthread\u t x为static来解决这

因此,我使用C++11,并创建了一个类

C类
{
私人:
排队等候;
pthread_t x;
公众:
C(){phthread_create(&x,NULL,d_q,NULL);
void log(int p);//推入q。
void*d_q(void*q);//这是一个将弹出s的函数。假设s是线程安全的。
}
问题是行
pthread\u create(&x,NULL,d\u q,NULL)
。它给了我
错误:必须调用对非静态成员的引用。

我通过使pthread\u t x
为static
来解决这个问题。但我不想这样做,因为有两个原因:

  • 创建带有静态函数的线程意味着只有一个函数副本
  • 线程是在构造函数中创建的。我不知道如果创建多个C类对象会发生什么
  • 有人能给我一个解决办法吗

    解决:谢谢你的帮助!
    另外,一个非常好的建议是,对于未来的用户来说,更喜欢std::thread而不是pthread!

    至于您的问题,指向(非静态)成员函数的指针与指向成员函数的指针不同。非静态成员函数需要调用对象的实例

    有两种方法可以解决这个问题:如果坚持使用POSIX线程函数,那么可以创建一个
    静态
    包装函数,将实例作为参数传递给线程,并在静态包装函数中使用传递的对象调用实际函数

    另一个解决方案是使用,这将使它更容易:

    class C
    {
        std::thread thread_;
        ...
    public:
        C() : thread_(&C::d_q, this) {}
        ...
        void d_q() { ... }
    };
    

    试着使用
    std::thread
    std::int
    ?那是什么?使用
    std::thread
    。有很多关于如何绑定其中一个非静态成员函数的示例。我会注意到,在构造函数中创建线程通常是个坏主意-如果在构造函数中抛出异常,就会自动销毁对象,但是t线程仍在运行并试图使用该对象。如果该对象是在自动作用域中创建的(例如,一个局部变量),则在线程终止之前,您也将运行到销毁中,除非您小心地将其加入到析构函数中。最好使用
    start()显式
    函数或类似的函数。好的,这带来了另一个问题。错误:尝试使用已删除的函数!@VShreyas,这篇文章可能对你有帮助:好的。d_q定义为:void d d_q();所以,没有参数。你现在能帮我吗?@VShreyas删除了什么函数?