4

冗長で申し訳ありません。コード サンプルを最小限の機能のクラスとmain()メソッドに凝縮するために最善を尽くしました。

が呼び出されたときに終了するようにワーカー スレッド内でatomic_flag通知するために を使用しようとしています。_rx()stop()

問題はワーカースレッドを作成しようとしていることにあると思いますが、

thread SanityTestThread(&SanityTest::_rx, *this);

それはどういうわけか私のものと衝突しますatomic_flag

コード サンプル (コンパイルされません):

 #include <cstdio>
 #include <chrono>

 #include <unistd.h>
 #include <atomic>
 #include <iostream>
 #include <thread>

 using namespace std;

 class SanityTest
 {

   public:
     SanityTest(){}
     void start();
     void stop();

   private:
     void _rx();
     atomic_flag flag;

 }; // end class SanityTest

void SanityTest::_rx()
{
  while(flag.test_and_set())
  {
    this_thread::sleep_for(chrono::seconds(1));
    cout << "'sup foo" << endl;
  }
} // end _rx

void SanityTest::start()
{
  flag.test_and_set();
  thread SanityTestThread(&SanityTest::_rx, *this);
  SanityTestThread.detach();
} // end start

void SanityTest::stop()
{
  flag.clear();
} // end start

int main(){
  SanityTest s;// = SanityTest();
  s.start();
  this_thread::sleep_for(chrono::seconds(10));
  s.stop();
  return 0;
} // end main

記録として、次のように my への参照をすべて削除し、ループを for ループにatomic_flag置き換えることで、プログラムをコンパイルして実行することができます。_rx()

void SanityTest::_rx()
{
  for(int i=0; i <=10; ++ i)
  {
    this_thread::sleep_for(chrono::seconds(1));
    cout << "'sup foo" << endl;
  }
} // end _rx

コンパイラ エラー:

In file included from ./SanityTest.cpp:1:0:
./SanityTest.hpp:14:7: note: ‘SanityTest::SanityTest(SanityTest&&)’ is implicitly deleted because the default definition would be ill-formed:
 class SanityTest
       ^
./SanityTest.hpp:14:7: error: use of deleted function ‘std::atomic_flag::atomic_flag(const std::atomic_flag&)’
In file included from /usr/include/c++/4.8/atomic:41:0,
                 from ./SanityTest.hpp:8,
                 from ./SanityTest.cpp:1:
/usr/include/c++/4.8/bits/atomic_base.h:275:5: error: declared here
     atomic_flag(const atomic_flag&) = delete;
     ^
In file included from /usr/include/c++/4.8/functional:55:0,
                 from /usr/include/c++/4.8/thread:39,
                 from ./SanityTest.hpp:10,
                 from ./SanityTest.cpp:1:

...

In file included from ./SanityTest.cpp:1:0:
./SanityTest.hpp:14:7: note: ‘SanityTest::SanityTest(SanityTest&&)’ is implicitly deleted because the default definition would be ill-formed:
 class SanityTest
       ^
./SanityTest.hpp:14:7: error: use of deleted function ‘std::atomic_flag::atomic_flag(const std::atomic_flag&)’
In file included from /usr/include/c++/4.8/atomic:41:0,
                 from ./SanityTest.hpp:8,
                 from ./SanityTest.cpp:1:
/usr/include/c++/4.8/bits/atomic_base.h:275:5: error: declared here
     atomic_flag(const atomic_flag&) = delete;
     ^
In file included from /usr/include/c++/4.8/functional:55:0,
                 from /usr/include/c++/4.8/thread:39,
                 from ./SanityTest.hpp:10,
                 from ./SanityTest.cpp:1:

psこれは、g++ -pthread -std=c++0x -o SanityTest ./SanityTest.cpp

4

1 に答える 1

2

交換するだけ

thread SanityTestThread(&SanityTest::_rx, *this);

thread SanityTestThread(&SanityTest::_rx, this);

オブジェクト自体ではなく、オブジェクトへのポインターを渡すことを意図していた可能性があります (その結果、そのオブジェクトがコピーされ&SanityTest::_rx、元のオブジェクトではなくそのコピーでメンバー関数ポインターが呼び出されます)。

エラー メッセージの理由は、本質的にstd::atomic_flagはコピー コンストラクターがないため、コンパイラーはSanityTestクラスのデフォルトのコンストラクターも生成しないためですが、繰り返しになりますが、SanityTest オブジェクトをここにコピーする必要はありません。

于 2015-06-17T14:02:04.160 に答える