0

これは、クラスのメンバー関数の実行で以前投稿した問題のフォローアップです。

以下の 20 行目の最初のコード スニペットに示すように、スレッド コンストラクターへのパラメーターとしてクラスのメンバー関数を受け入れる方法で C++1.1 スレッドを実験しようとしています。クラス定義は、2 番目のコード スニペットに示されています。以前の関連投稿で与えられた回答に基づいて、コードは正常にコンパイルされます。ただし、最初のスニペットの 20 行目で実行時エラーが発生します。GDB バックトレースは 3 番目のスニペットに示されています。私は C++ を初めて使用するので、このエラーを正しく解釈できませんでした。何が問題なのか教えてください。ありがとう。

スニペット 1: スレッドの初期化 (main_app.cpp)

#include <thread>
#include "ServiceRegistrar.hpp"

#define SERVER_TYPE  100065
#define SERVER_INST_LOWER  1
#define SERVER_INST_UPPER  2
#define TIMEOUT  500000

int main()
{
  ServiceRegistrar sr1(SERVER_TYPE, TIMEOUT, SERVER_INST_LOWER, SERVER_INST_LOWER);
      /*LINE 20 is the following*/
  std::thread t(&ServiceRegistrar::subscribe2TopologyServer, &sr1);
t.join();
  sr1.publishForSRs();

}

スニペット 2: クラス定義

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;           
  };

スニペット 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
4

1 に答える 1

1

これはおそらく、スレッド サポートが有効になっていないことを意味します。-pthreadコンパイラのコマンド ライン引数に (リンク ステップで)追加してみてください。

于 2013-02-28T19:05:05.527 に答える