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_C++11_Stdthread - Fatal编程技术网

C++ 后续:执行类的成员函数

C++ 后续:执行类的成员函数,c++,multithreading,c++11,stdthread,C++,Multithreading,C++11,Stdthread,这是我之前在上发布的问题的后续 我试图以一种方式来试验C++1.1线程,即它接受类的成员函数作为线程构造函数的参数,如下面第20行标记的第一个代码片段所示。类定义在第二个代码段中给出。根据前面相关文章给出的答案,代码现在编译得很好。但是,现在我在第1个代码段的第20行得到了一个运行时错误。GDB回溯显示在第三个代码段中。我是C++新手,不能正确解释这个错误。你能告诉我怎么了吗?谢谢 代码片段1:线程初始化(main_app.cpp) 代码片段3:GDB回溯 (gdb) r Startin

这是我之前在上发布的问题的后续

我试图以一种方式来试验C++1.1线程,即它接受类的成员函数作为线程构造函数的参数,如下面第20行标记的第一个代码片段所示。类定义在第二个代码段中给出。根据前面相关文章给出的答案,代码现在编译得很好。但是,现在我在第1个代码段的第20行得到了一个运行时错误。GDB回溯显示在第三个代码段中。我是C++新手,不能正确解释这个错误。你能告诉我怎么了吗?谢谢

代码片段1:线程初始化(main_app.cpp)

代码片段3:GDB回溯

  (gdb) r
  Starting program: /home/......./src/main_app 
  terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted

  Program received signal SIGABRT, Aborted.
  0xb7fdd424 in __kernel_vsyscall ()
  (gdb) bt
  #0  0xb7fdd424 in __kernel_vsyscall ()
  #1  0xb7d471df in raise () from /lib/i386-linux-gnu/libc.so.6
  #2  0xb7d4a825 in abort () from /lib/i386-linux-gnu/libc.so.6
  #3  0xb7f2e8ad in __gnu_cxx::__verbose_terminate_handler() ()
  from /usr/lib/i386-linux-gnu/libstdc++.so.6
  #4  0xb7f2c4f3 in ?? () from /usr/lib/i386-linux-gnu/libstdc++.so.6
  #5  0xb7f2c52f in std::terminate() ()
  from /usr/lib/i386-linux-gnu/libstdc++.so.6
  #6  0xb7f2c7ce in __cxa_throw () from /usr/lib/i386-linux-gnu/libstdc++.so.6
  #7  0xb7f8772e in std::__throw_system_error(int) ()
  from /usr/lib/i386-linux-gnu/libstdc++.so.6
  #8  0xb7f8883c in   std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>) () from   /usr/lib/i386-linux-gnu/libstdc++.so.6
  #9  0x0804981a in std::thread::thread<void (ServiceRegistrar::*)(),     ServiceRegistrar*>(void (ServiceRegistrar::*&&)(), ServiceRegistrar*&&) (this=0xbffff050, 
  __f=
  @0xbffff058: (void (ServiceRegistrar::*)(ServiceRegistrar * const)) 0x80491d2   <ServiceRegistrar::subscribe2TopologyServer()>)
   at /usr/include/c++/4.7/thread:133
  #10 0x08049526 in main () at main_app.cpp:20
(gdb)r
启动程序:/home/…/src/main\u应用程序
在抛出“std::system_error”实例后调用terminate
what():不允许操作
程序收到信号SIGABRT,中止。
内核vsyscall()中的0xb7fdd424
(gdb)英国电信
#内核vsyscall()中的0 0xb7fdd424
#从/lib/i386 linux gnu/libc.so.6在raise()中输入1 0xb7d471df
#来自/lib/i386 linux gnu/libc.so.6的中止()中的2 0xb7d4a825
#cxx中的3 0xb7f2e8ad::\uuuuuuuVerbose\uTerminate\uHandler()()
来自/usr/lib/i386 linux gnu/libstdc++.so.6
#4 0xb7f2c4f3英寸??()来自/usr/lib/i386 linux gnu/libstdc++.so.6
#std::terminate()中的5 0xb7f2c52f()
来自/usr/lib/i386 linux gnu/libstdc++.so.6
#来自/usr/lib/i386 linux gnu/libstdc++.so.6的
#标准中的7 0xb7f8772e:uuu抛出系统错误(int)()
来自/usr/lib/i386 linux gnu/libstdc++.so.6
#std::thread::_M_start_thread(std::shared_ptr)()中的8 0xb7f8883c来自/usr/lib/i386 linux gnu/libstdc++.so.6
#9 std::thread::thread(void(serviceRegistrator:*&&&)(),serviceRegistrator*&&&)中的0x0804981a(this=0xbffff050,
__f=
@0xbffff058:(无效(ServiceRegistrator::*)(ServiceRegistrator*const))0x80491d2)
at/usr/include/c++/4.7/thread:133
#10 0x08049526在主管道()中,位于主管道附件cpp:20处

这可能意味着您尚未启用线程支持。尝试将
-pthread
添加到编译器的命令行参数中(在链接步骤中)。

我实际上已经喜欢:g++-g-c-Wall-std=c++11 main_app.cpp serviceRegistrator.hpp-pthread还有其他建议吗?@Fardaarda抱歉,显然这两个步骤中都需要它,以防万一,因为-pthread可能会设置一些定义(取决于编译器/平台)@Stephen Lin:我对这个编译链接有点陌生,我想知道我下面写的是否正确,因为我仍然得到这个操作不允许的错误。谢谢。g++-g-c-Wall-std=c++11 main_app.cpp serviceRegistrator.hpp-pthread-lpthread@Fardaarda如果需要编译器,请不要使用
-lpthread
,只使用
-pthread
支持后者…这是编译步骤命令(
-c
),当您链接创建可执行文件时?(即
g++-o main_app
)您也应该在那里添加
-pthread
。您可以将线程的创建包装在
try
块中,并为
系统错误
异常添加
catch
块。然后您可以对该异常调用
what()
并查看是否获得一些有用的信息。这难道不是“不允许操作”吗如图所示?@StephenLin:你说得对。我不知道为什么我跳过了那一行
class ServiceRegistrar
{
  public:
    ServiceRegistrar(int serverType, int serverTimeOut, int serverInstanceLower, int serverInstanceUpper)
       : mServerType(serverType),
         mServerTimeOut(serverTimeOut),
         mServerInstanceLower(serverInstanceLower),
         mServerInstanceUpper(serverInstanceUpper)
         { }

     void subscribe2TopologyServer();
     void publishForSRs();
     void publishForServices();

  private:
     int mServerType;
     int mServerTimeOut;
     int mServerInstanceLower;
         int mServerInstanceUpper;           
  };
  (gdb) r
  Starting program: /home/......./src/main_app 
  terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted

  Program received signal SIGABRT, Aborted.
  0xb7fdd424 in __kernel_vsyscall ()
  (gdb) bt
  #0  0xb7fdd424 in __kernel_vsyscall ()
  #1  0xb7d471df in raise () from /lib/i386-linux-gnu/libc.so.6
  #2  0xb7d4a825 in abort () from /lib/i386-linux-gnu/libc.so.6
  #3  0xb7f2e8ad in __gnu_cxx::__verbose_terminate_handler() ()
  from /usr/lib/i386-linux-gnu/libstdc++.so.6
  #4  0xb7f2c4f3 in ?? () from /usr/lib/i386-linux-gnu/libstdc++.so.6
  #5  0xb7f2c52f in std::terminate() ()
  from /usr/lib/i386-linux-gnu/libstdc++.so.6
  #6  0xb7f2c7ce in __cxa_throw () from /usr/lib/i386-linux-gnu/libstdc++.so.6
  #7  0xb7f8772e in std::__throw_system_error(int) ()
  from /usr/lib/i386-linux-gnu/libstdc++.so.6
  #8  0xb7f8883c in   std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>) () from   /usr/lib/i386-linux-gnu/libstdc++.so.6
  #9  0x0804981a in std::thread::thread<void (ServiceRegistrar::*)(),     ServiceRegistrar*>(void (ServiceRegistrar::*&&)(), ServiceRegistrar*&&) (this=0xbffff050, 
  __f=
  @0xbffff058: (void (ServiceRegistrar::*)(ServiceRegistrar * const)) 0x80491d2   <ServiceRegistrar::subscribe2TopologyServer()>)
   at /usr/include/c++/4.7/thread:133
  #10 0x08049526 in main () at main_app.cpp:20