[過去ログ] C++相談室 part157 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
1: 2021/08/09(月)10:57 ID:JaaB5Egp(1/2) AAS
前スレ
C++相談室 part156
2chスレ:tech
2
(1): 2021/08/09(月)11:24 ID:M3I2CbwW(1) AAS
前スレの >>997
キューが溢れないようにするのなら
スレッドが実行中かどうかを確認するのではなく
キューサイズを見るほうが確実じゃないですか?
3
(1): 2021/08/09(月)11:43 ID:GC6B710d(1/5) AAS
>スレッドが実行中か確認したいってどんなときなのかな?
たとえばゲームでセーブするとき、
メインの処理はブロックしたくないので別スレッドで実行しつつ「セーブ中です」みたいな表示を出し、終了したら消す
みたいな時かな
4
(4): 2021/08/09(月)11:48 ID:OWI9S7jW(1/2) AAS
>>3
それはセーブするスレッドのほうが開始と終了を通知すればよくない?
そうデザインするもんじゃないの?

できないときもあるのかもしれんが。
5
(2): 2021/08/09(月)11:56 ID:GC6B710d(2/5) AAS
>>4
もちろん方法ならいくらでもあると思うけど、別スレッドのインスタンス1つで全部済むなら、そっちの方がすっきりするし楽でしょ
6: 2021/08/09(月)12:12 ID:GC6B710d(3/5) AAS
>>4,5
あぁ、いやそうじゃないか
ゲームのあらゆる部分をスレッドセーフで設計すれば良いのかもしれないけど、
ゲームのメインの状態遷移なんてわざわざマルチスレッド化するような重い処理でもないので、
その辺の表示とかはシングルスレッド前提で書いてるわけよ、もちろんそのほうが楽だからw
7
(1): 2021/08/09(月)12:17 ID:qYrd5+ip(1) AAS
この「実行中」が実際にタイムスライスが割り当てられている状態を意味しているんであれば
OSにもよるが実装が大変な割に実際に役立つシーンは限られるような。
>>4であればjoinableで十分だろうし。
8: 2021/08/09(月)12:25 ID:DVzh2mox(1) AAS
別スレッド処理の進捗を他スレッドから閲覧するためのパラメータを使っってる時点で、お察し
9
(1): 2021/08/09(月)12:40 ID:S8n0VVLE(1/3) AAS
前スレ997は色々勘違いしてそうな気がする
普通pushしようとしてキューが満杯なら何らかの同期メカニズムで自分を待ち状態にする
pop側はpopしたらその同期メカニズムに対して待ちを解除するだけだからスレッド自体が実行中かどうかなんて見る必要がない
10: 2021/08/09(月)13:35 ID:eF2Q2UUf(1/4) AAS
std::condition_variable
11: ハノン ◆QZaw55cn4c 2021/08/09(月)13:52 AAS
正直いって pthread の条件変数は私には理解が難しく、私は安易に win32api のクリティカルセッション&シグナルを多用してしまうのです
ただし、スタベーションに陥ることが多々あり、どうもクリティカルセクション・シグナルでは駄目なパターンがあるかもしれない、とヒヤヒヤしています‥‥
12: 2021/08/09(月)14:01 ID:TRAo/ccI(1/2) AAS
>>2
別に
Producer(pushする側)がこれからpushするのを待っている場合、
Consumer(popする側)はキューサイズ(キューの中の要素数)を見ても
Producerが待っているのかどうかの情報を得られない
なぜなら、まだpushしていないからな
13
(1): 2021/08/09(月)14:14 ID:TRAo/ccI(2/2) AAS
>>9
>pop側はpopしたらその同期メカニズムに対して待ちを解除するだけ
そういう実現方法も(pop側が行った待ち解除がキューイングされれば)成立する鴨、と>>997にちゃんと書いているもーん
14: 2021/08/09(月)14:32 ID:JaaB5Egp(2/2) AAS
>>5
>>4って新規スレッド1個で全部済むと思うんだけど……
15
(2): 2021/08/09(月)14:33 ID:S8n0VVLE(2/3) AAS
>>13
いや、スレッドの実行状態なんて見てもしゃーないって話
pop後にpush側が実行中だとしてもそのチェック直後にpushするかも知れん
要するにスレッドの実行状態の変化は排他制御できないから意味がないって話
pop前にいちいちスレッドをsuspendしてチェックしてからresumeするとかするならできるかもしれないけどw
16: 2021/08/09(月)14:34 ID:aCXIbwxy(1) AAS
std::vectorの部分ベクトルの切り出しって絶対O(要素数)の計算量かかりますよね?
17: 2021/08/09(月)14:40 ID:fi8SjIox(1) AAS
「部分ベクトルの切り出し」とは何かを定義せよ。
18: 2021/08/09(月)14:47 ID:eF2Q2UUf(2/4) AAS
こういうの?
std::vector<int> a{ 4, 6, 4, 9 };
std::vector<int> b(a.begin() + 1, a.begin() + 2);
19
(1): 2021/08/09(月)15:11 ID:KzU8BZnC(1) AAS
参照できればいいのか、コピーがいるのか、切り出し位置はわかってるのか、検索を伴うのか、
その辺の条件もなしに計算量の議論なんて出来んわ
20
(3): 2021/08/09(月)16:11 ID:6v1cUfUr(1) AAS
クラスAの内部にクラスBがある (入れ子クラス) として、BからAのメンバにアクセスするテクってないんですかね?
アクセスしたいメンバをstaticにはしたくないです
21
(1): 2021/08/09(月)16:20 ID:GC6B710d(4/5) AAS
>>20
AへのポインタをBに定義して、コンストラクタかなんかで渡せばいいのでは?
22: はちみつ餃子 ◆8X2XSCHEME 2021/08/09(月)16:48 ID:OWI9S7jW(2/2) AAS
>>20
クラスの中でクラスを定義しても A の名前空間の中に B が定義されるってだけ。
B のオブジェクトを作っても A のオブジェクトが存在しないなら存在しないオブジェクトのメンバにはアクセスできない。
A のオブジェクト (インスタンス) と B のオブジェクトの間には勝手に関係が出来たりもしない。
関係ないのに関係あるように見えて初心者が混乱してるのはどっかの質問サイトでも見たことがある。
よく理解できてないならまずはクラスの定義を入れ子にせずにやってみるのがオススメ。
23
(1): 2021/08/09(月)16:52 ID:S8n0VVLE(3/3) AAS
>>20
AやBのインスタンスをどう生成してるのよ
>>21の言うようにAへのポインタ持ってたら普通にアクセスするだけでしょ
class A {
public: int i;
class B {
public: B(A* a){ … = a->i; }
}
}

省1
24: 2021/08/09(月)16:59 ID:eF2Q2UUf(3/4) AAS
>>19
コピーか参照かは1要素あたりの処理量なので
コンテナの計算量には関係ない
25: 2021/08/09(月)17:00 ID:hJGoZPOe(1) AAS
絶対レビュー通らないウンココードでよいなら
(char*)this + offsetof(A, b)でなんとかならんのか
26: 2021/08/09(月)17:33 ID:GC6B710d(5/5) AAS
class Aをtemplate化して、class BでAを継承すれはメンバにはアクセスできるけど、たぶんそういうことがしないんじゃないんだろうなw
コンテナクラスのイテレータから親クラスインスタンスのメンバにアクセスしたいとかか?
27: 2021/08/09(月)17:48 ID:eF2Q2UUf(4/4) AAS
リファレンサを作るときなんか親オブジェクトへのポインタ使うね
28: 2021/08/09(月)20:07 ID:XVy1LhuX(1) AAS
>>23
普通にコンポジションで実現できる条件だよな
メルプラネットの奴らも同じこと言いそう
29: 2021/08/10(火)00:55 ID:rk6SLsdN(1/2) AAS
親オブジェクトへのポインタをうっかり共有ポインタにすると循環参照の原因になる(小並感)
30
(2): 2021/08/10(火)03:53 ID:mPLpHQ1a(1) AAS
+=の引数が1のときは++を呼ぶようにする方法ってありますか
31: ハノン ◆QZaw55cn4c 2021/08/10(火)04:41 AAS
>>30
自分でそう書くのがいいのでは?
(n == 1) ? x++ : x += n;
32
(1): 2021/08/10(火)08:16 ID:JssHBcjd(1) AAS
>>30
遅くなる可能性があるから気にしない。
コンパイル時に解決できるなら++使っても同じだし、実行時に解決するようだと1かどうかの判定が増えて遅くなる。
33: 2021/08/10(火)12:11 ID:OMlKC5pQ(1) AAS
TCPIPのソケット通信プログラム作ろうと思っているのですが、
コネクションを維持し続ける場合のデメリットって何がありますか?
34
(1): 2021/08/10(火)12:42 ID:ZRv1Vy3I(1) AAS
>>32
後出しになって申し訳ありませんが、*、!=、++、+=、- 辺りが定義されたイテレータを持つ自作のデータ構造を範囲for文で走査することを考えています
それ自体は想定した通りにできたのですが、その範囲for文をomp並列化するとイテレータのインクリメントが ++ でなく +=1 で行われるようになります
で、その自作データ構造では ++ よりも += の方が重い実装になっているので、+=1 よりは ++ の方を使ってほしいです

omp に特有の仕様に思えるので、普通に += の冒頭で引数が1かどうかの分岐を入れることにしようかと思います

ありがとうございました
35
(3): 2021/08/10(火)14:57 ID:W7aMf5pX(1/8) AAS
マルチスレッドのキューのサンプルをSTLで作りゃったーしたったわ、
外部リンク:ideone.com

↓ここのC#のサンプルプログラムの移植
// 外部リンク[html]:atmarkit.itmedia.co.jp

フラグの必要性は意味を取り違えていたわサーセン、
しかしこれフラグ(runningFlag)無しでやるとしたら終了時にConsumerがいちいちProducerが
join可能か調べる(std::thread::joinable())ことになってスレッドより先にプログラムした人が終了したくなるお
フラグで済むのに、
36: 2021/08/10(火)15:21 ID:W7aMf5pX(2/8) AAS
Windowsのイベントオブジェクトと条件変数の違いまとめ
外部リンク:dev.activebasic.com
37: 2021/08/10(火)15:28 ID:W7aMf5pX(3/8) AAS
と思ったがやっぱ当初の意味(Producerが待っているのかどうか)のフラグが無いと、
キューが空になった後のnotifyで、1万個あるかもしれない仕事の無いConsumerが次々起床され、
巡り巡ってようやくProducerが起床されるみたいな非効率が生じる余地があるやんけ;;;

やっぱ当初の漏れのフラグ必要という意見で正しかったのかもしんない
漏れは天才なのかもしんない、
かもしんない運転、
38: 2021/08/10(火)18:25 ID:W7aMf5pX(4/8) AAS
つかその前に、漏れの天才eyesが改造元とした@IT様のサンプルプログラムに
スレッドのディスパッチ依存で終了できなくなることがあるという恥ずかしいバグを発見した、
論より証拠:
外部リンク:ideone.com

変更点は、Consumerを1個にして、Producerの側のある個所にsleepを入れただけ
(マクロ CAUSE_STOPPING_FAILURE_BUG で条件コンパイルで有効にしている個所
これでConsumerスレッドが終了できなくなる

対策は、同ソースコードの BUGFIX_STOPPING_FAILURE_BUG マクロを有効にしたら宜しい

天才の判断である
39
(1): 2021/08/10(火)18:42 ID:mYAwPqTL(1/2) AAS
>>34
すみません。この件なんですが、

void operator += (int n){
 if(n == 1){
  // ここ
 }else{
  ……
 }
}

「ここ」で演算子++を呼びたいときってどう書いたら良いでしょうか
省3
40
(1): 2021/08/10(火)19:06 ID:W7aMf5pX(5/8) AAS
というわけで最終的な版を貼る、
外部リンク:ideone.com

ProduceとConsumerそれぞれに対する起床条件を分離すた、

日本語ではいくら説明しても一向に理解の光が射さなかったボンクラ学生レヴェルの>>15でも
100行足らずのソースコードなら読めるんじゃないの
知らんけど
41
(1): 2021/08/10(火)19:11 ID:cMFKuo8t(1) AAS
>>39
++(*this);
または
this->operator++();
42: 2021/08/10(火)19:24 ID:mYAwPqTL(2/2) AAS
>>41
ありがとうございます
前置/後置の別が自分の中でよく付いていませんが、教えていただいたことに基づいて調べてみます
43: 2021/08/10(火)19:37 ID:Lbev+Y0v(1/3) AAS
>>40
で、そこで取れると良い「スレッドの実行状態」って結局何なん?
44: 2021/08/10(火)20:32 ID:W7aMf5pX(6/8) AAS
「スレッドの実行状態とは起こす対象のスレッドが具体的に何をしているか、や
とれると良い、ではなく取ることが必須や

なぜなら、WIN32APIのイベントは1回だけキューイングされるので投げたら投げっぱなしでもそのうち
受け取ってもらえるが、(pthread系統のしくみである)状態変数はそうではなく、
起床信号を投げつける前に相手が信号をキャッチ可能なのか(待ちに入っているのか)知る必要がある

なお、イベントのキューイングの有無によって話が変わる旨はすでに書いたある(>>997
上記のことを書いてあるというのに理解もせずにしつこく同じことを繰り返し言ってきたのが>>15
45
(1): 2021/08/10(火)21:01 ID:Lbev+Y0v(2/3) AAS
>「スレッドの実行状態とは起こす対象のスレッドが具体的に何をしているか、や

それって具体的にどういうものを想定しているんだろう。
もともとの話はstd::threadに追加したい機能だったと思うけど、この説明だけじゃ全然想像がつかない。
46: 2021/08/10(火)22:11 ID:W7aMf5pX(7/8) AAS
なんか元にしたコードにまだ問題があった気配orz
MAX_QUEを1にすると高い頻度でProducerとConsumerが両方待ちに入ってしまいハングアップする、、、
対策版は多分これ↓で良いんジャマイカ……
外部リンク:ideone.com
(何が起きていて、どうしてこれで対策なのかはコメント参照、

>>45
>>「スレッドの実行状態とは起こす対象のスレッドが具体的に何をしているか、や
>それって具体的にどういうものを想定しているんだろう。
今回のサンプルコードでは具体的にはありません(キリ
しいて言えば!runningFlagならConsumerが自身を待ちに入れない(∵Producerがもう起こしてはくれない
省3
47
(1): 2021/08/10(火)22:25 ID:W7aMf5pX(8/8) AAS
でもまあコメントを読んでいただければ、pthread系のしくみだと
起こす対象のスレッドが何をしているのかについて常に配慮が居るということをご理解いただけるのではないかと思う
今回はたまたま見込みでnotifyして話が通るからスレッドの実行状態を表す変数が具体的に生じなかっただけ
48
(1): 2021/08/10(火)22:47 ID:C0wcAbjz(1/3) AAS
すみません。
自作プログラムが特定のPCだけ同じ場所でntdll.dllのエラーで止まるのですが、何が原因と考えられるでしょうか?
他のPCでは問題無く進み、エラーを起こすPCのメモリにも異常は見つかりませんでした。
49: 2021/08/10(火)23:06 ID:OOQ3UOoB(1/2) AAS
>>48
未初期化変数があって無効なアドレスにアクセスしたとかじゃね

確実なことを言うためには例外コードが知りたい
あと問題の箇所のソースコードも
50: 2021/08/10(火)23:24 ID:C0wcAbjz(2/3) AAS
ソースはすみません、ちょっと出せないです
エラーコードは0xc0000005でしま
51: 2021/08/10(火)23:30 ID:OOQ3UOoB(2/2) AAS
はいメモリアクセス違反ですね
デバッガでがんばって調べてね
52: 2021/08/10(火)23:32 ID:C0wcAbjz(3/3) AAS
あざす
1-
あと 950 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.317s*