1
class Class {
public:
    Class ();
private:
    std::thread* updationThread;
};

コンストラクタ:

Class::Class() {
    updationThread = new std::thread(&someFunc);
}

アプリケーションのある時点で、そのスレッドを一時停止して関数を呼び出す必要があり、その関数の実行後にスレッドを再開する必要があります。ここで起こるとしましょう:

void Class::aFunction() {
     functionToBeCalled(); //Before this, the thread should be paused
     //Now, the thread should be resumed.
}

functionToBeCalled()functionと useで別のスレッドを使用しようとしましthread::joinたが、何らかの理由でそれを行うことができませんでした。

スレッドを一時停止するにはどうすればよいですか? またはthread::join、他のスレッドが終了するまでスレッドを一時停止するにはどうすればよいですか?

4

2 に答える 2

4

簡単に(標準的な方法で)スレッドを「一時停止」してから再開できるとは思いません。Unix フレーバーの OS を使用している場合は、SIGSTOP と SIGCONT を送信できると思いますが、それ以外の場合は、内部のアトミック部分をミューテックスとロックで適切にマークし、対応するミューテックスのロックでsomeFunc()ラップする必要があります。functionToBeCalled()

std::mutex m; // Global mutex, you should find a better place to put it
              // (possibly in your object)

そして関数内:

void someFunc() {
    // I am just making up stuff here
    while(...) {
        func1();

        {
           std::lock_guard<std::mutex> lock(m); // lock the mutex
           ...; // Stuff that must not run with functionToBeCalled()
        } // Mutex unlocked here, by end of scope
    }
}

そして呼び出すときfunctionToBeCalled()

void Class::aFunction() {
    std::lock_guard<std::mutex> lock(m); // lock the mutex
    functionToBeCalled();
} // Mutex unlocked here, by end of scope
于 2013-09-23T19:25:22.773 に答える
2

条件変数を使用できます。あなたの状況に似た例がそこに示されています: http://en.cppreference.com/w/cpp/thread/condition_variable

于 2013-09-23T19:14:15.973 に答える