前提・実現したいこと
マルチスレッドで親スレッドや他スレッドからSuspend、Resume相当の操作を行いたい。
(他スレッドからの任意のSuspend、Resumeは本質的に危険だからやめたほうがいいという議論は、行わない方向でお願いします。)
なるべく、ThredFunc()内に自身がSuspend、Resumeするかどうか判断するコードは書きたくないです。
該当のソースコード
C++
1#include <iostream> 2#include <thread> 3#include <chrono> 4 5//OnとOffを5回1秒周期で出力します。 6void ThreadFunc(char ThreadName) 7{ 8 int i = 0; 9 while (i < 5) 10 { 11 //コンソール出力はMutexが取れているものとする(取れてませんが) 12 std::cout << ThreadName << " run::On" << i << std::endl; 13 std::this_thread::sleep_for(std::chrono::seconds(1)); 14 std::cout << ThreadName << " run::Off" << i << std::endl; 15 std::this_thread::sleep_for(std::chrono::seconds(1)); 16 i++; 17 } 18}; 19 20int main(int, char **) 21{ 22 auto th1 = std::thread(ThreadFunc, 'A'); //途中で止めたいスレッド 23 auto th2 = std::thread(ThreadFunc, 'B'); //最後まで走るスレッド 24 25 std::this_thread::sleep_for(std::chrono::seconds(2)); 26 //th1.suspend(); //この操作がしたい SUPECIAL::Suspend(th1);でも可。 27 th2.join(); 28 //th1.resume(); //この操作がしたい SUPECIAL::Resume(th1);でも可。 29 30 th1.join(); 31} 32
期待する出力メッセージ
以下のようなメッセージがでることを期待します。
A run::On0 B run::On0 B run::Off0 A run::Off0 A run::On1 B run::On1 A run::Off1 B run::Off1 B run::On2 #ここでth1.susupend() B run::Off2 B run::On3 B run::Off3 B run::On4 B run::Off4 A run::On2 A run::Off2 A run::On3 A run::Off3 A run::On4 A run::Off4
###考えていること
止めれるのであれば止めれたら嬉しいが、最低でも、子スレッドの関数コール時に__cyg_profile_func_enter()で止めれるようにしたい。
ながーくなりそうなので、面倒だなぁと感じますが、現在模索中です。
補足情報
gcc -v
組み込み spec を使用しています。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/lto-wrapper
ターゲット: x86_64-pc-linux-gnu
configure 設定: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --with-isl --with-linker-hash-style=gnu --with-system-zlib --enable-__cxa_atexit --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-install-libiberty --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-libunwind-exceptions --disable-werror gdc_include_dir=/usr/include/dlang/gdc
スレッドモデル: posix
Supported LTO compression algorithms: zlib zstd
gcc バージョン 10.2.0 (GCC)
uname -a
Linux @@@@ 5.8.5-arch1-1 #1 SMP PREEMPT Thu, 27 Aug 2020 18:53:02 +0000 x86_64 GNU/Linux
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/15 05:59