C++ 在构造函数内创建线程
因此,我使用C++11,并创建了一个类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类
{
私人:
排队等候;
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
来解决这个问题。但我不想这样做,因为有两个原因:
另外,一个非常好的建议是,对于未来的用户来说,更喜欢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删除了什么函数?