1 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 10:57:31.60 ID:JaaB5Egp.net] 前スレ C++相談室 part156 https://mevius.5ch.net/test/read.cgi/tech/1621389313/
2 名前:デフォルトの名無しさん [2021/08/09(月) 11:24:40.26 ID:M3I2CbwW.net] 前スレの >>997 キューが溢れないようにするのなら スレッドが実行中かどうかを確認するのではなく キューサイズを見るほうが確実じゃないですか?
3 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 11:43:30.76 ID:GC6B710d.net] >スレッドが実行中か確認したいってどんなときなのかな? たとえばゲームでセーブするとき、 メインの処理はブロックしたくないので別スレッドで実行しつつ「セーブ中です」みたいな表示を出し、終了したら消す みたいな時かな
4 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 11:48:24.98 ID:OWI9S7jW.net] >>3 それはセーブするスレッドのほうが開始と終了を通知すればよくない? そうデザインするもんじゃないの? できないときもあるのかもしれんが。
5 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 11:56:53.44 ID:GC6B710d.net] >>4 もちろん方法ならいくらでもあると思うけど、別スレッドのインスタンス1つで全部済むなら、そっちの方がすっきりするし楽でしょ
6 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 12:12:57.14 ID:GC6B710d.net] >>4 ,5 あぁ、いやそうじゃないか ゲームのあらゆる部分をスレッドセーフで設計すれば良いのかもしれないけど、 ゲームのメインの状態遷移なんてわざわざマルチスレッド化するような重い処理でもないので、 その辺の表示とかはシングルスレッド前提で書いてるわけよ、もちろんそのほうが楽
7 名前:だからw [] [ここ壊れてます]
8 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 12:17:21.54 ID:qYrd5+ip.net] この「実行中」が実際にタイムスライスが割り当てられている状態を意味しているんであれば OSにもよるが実装が大変な割に実際に役立つシーンは限られるような。 >>4 であればjoinableで十分だろうし。
9 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 12:25:08.93 ID:DVzh2mox.net] 別スレッド処理の進捗を他スレッドから閲覧するためのパラメータを使っってる時点で、お察し
10 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 12:40:21.77 ID:S8n0VVLE.net] 前スレ997は色々勘違いしてそうな気がする 普通pushしようとしてキューが満杯なら何らかの同期メカニズムで自分を待ち状態にする pop側はpopしたらその同期メカニズムに対して待ちを解除するだけだからスレッド自体が実行中かどうかなんて見る必要がない
11 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 13:35:16.98 ID:eF2Q2UUf.net] std::condition_variable
12 名前:ハノン mailto:sage [2021/08/09(月) 13:52:46.20 .net] 正直いって pthread の条件変数は私には理解が難しく、私は安易に win32api のクリティカルセッション&シグナルを多用してしまうのです ただし、スタベーションに陥ることが多々あり、どうもクリティカルセクション・シグナルでは駄目なパターンがあるかもしれない、とヒヤヒヤしています‥‥
13 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 14:01:28.39 ID:TRAo/ccI.net] >>2 別に Producer(pushする側)がこれからpushするのを待っている場合、 Consumer(popする側)はキューサイズ(キューの中の要素数)を見ても Producerが待っているのかどうかの情報を得られない なぜなら、まだpushしていないからな
14 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 14:14:45.62 ID:TRAo/ccI.net] >>9 >pop側はpopしたらその同期メカニズムに対して待ちを解除するだけ そういう実現方法も(pop側が行った待ち解除がキューイングされれば)成立する鴨、と>>997 にちゃんと書いているもーん
15 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 14:32:36.91 ID:JaaB5Egp.net] >>5 >>4 って新規スレッド1個で全部済むと思うんだけど……
16 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 14:33:19.09 ID:S8n0VVLE.net] >>13 いや、スレッドの実行状態なんて見てもしゃーないって話 pop後にpush側が実行中だとしてもそのチェック直後にpushするかも知れん 要するにスレッドの実行状態の変化は排他制御できないから意味がないって話 pop前にいちいちスレッドをsuspendしてチェックしてからresumeするとかするならできるかもしれないけどw
17 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 14:34:07.65 ID:aCXIbwxy.net] std::vectorの部分ベクトルの切り出しって絶対O(要素数)の計算量かかりますよね?
18 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 14:40:14.51 ID:fi8SjIox.net] 「部分ベクトルの切り出し」とは何かを定義せよ。
19 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 14:47:54.30 ID:eF2Q2UUf.net] こういうの? std::vector<int> a{ 4, 6, 4, 9 }; std::vector<int> b(a.begin() + 1, a.begin() + 2);
20 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 15:11:52.58 ID:KzU8BZnC.net] 参照できればいいのか、コピーがいるのか、切り出し位置はわかってるのか、検索を伴うのか、 その辺の条件もなしに計算量の議論なんて出来んわ
21 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 16:11:11.49 ID:6v1cUfUr.net] クラスAの内部にクラスBがある (入れ子クラス) として、B
22 名前:からAのメンバにアクセスするテクってないんですかね? アクセスしたいメンバをstaticにはしたくないです [] [ここ壊れてます]
23 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 16:20:25.36 ID:GC6B710d.net] >>20 AへのポインタをBに定義して、コンストラクタかなんかで渡せばいいのでは?
24 名前:はちみつ餃子 mailto:sage [2021/08/09(月) 16:48:43.56 ID:OWI9S7jW.net] >>20 クラスの中でクラスを定義しても A の名前空間の中に B が定義されるってだけ。 B のオブジェクトを作っても A のオブジェクトが存在しないなら存在しないオブジェクトのメンバにはアクセスできない。 A のオブジェクト (インスタンス) と B のオブジェクトの間には勝手に関係が出来たりもしない。 関係ないのに関係あるように見えて初心者が混乱してるのはどっかの質問サイトでも見たことがある。 よく理解できてないならまずはクラスの定義を入れ子にせずにやってみるのがオススメ。
25 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 16:52:51.13 ID:S8n0VVLE.net] >>20 AやBのインスタンスをどう生成してるのよ >>21 の言うようにAへのポインタ持ってたら普通にアクセスするだけでしょ class A { public: int i; class B { public: B(A* a){ … = a->i; } } } … auto b = new A::B(new A());
26 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 16:59:35.77 ID:eF2Q2UUf.net] >>19 コピーか参照かは1要素あたりの処理量なので コンテナの計算量には関係ない
27 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 17:00:48.11 ID:hJGoZPOe.net] 絶対レビュー通らないウンココードでよいなら (char*)this + offsetof(A, b)でなんとかならんのか
28 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 17:33:38.90 ID:GC6B710d.net] class Aをtemplate化して、class BでAを継承すれはメンバにはアクセスできるけど、たぶんそういうことがしないんじゃないんだろうなw コンテナクラスのイテレータから親クラスインスタンスのメンバにアクセスしたいとかか?
29 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 17:48:31.00 ID:eF2Q2UUf.net] リファレンサを作るときなんか親オブジェクトへのポインタ使うね
30 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 20:07:17.09 ID:XVy1LhuX.net] >>23 普通にコンポジションで実現できる条件だよな メルプラネットの奴らも同じこと言いそう
31 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 00:55:38.92 ID:rk6SLsdN.net] 親オブジェクトへのポインタをうっかり共有ポインタにすると循環参照の原因になる(小並感)
32 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 03:53:30.08 ID:mPLpHQ1a.net] +=の引数が1のときは++を呼ぶようにする方法ってありますか
33 名前:ハノン mailto:sage [2021/08/10(火) 04:41:55.83 .net] >>30 自分でそう書くのがいいのでは? (n == 1) ? x++ : x += n;
34 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 08:16:11.83 ID:JssHBcjd.net] >>30 遅くなる可能性があるから気にしない。 コンパイル時に解決できるなら++使っても同じだし、実行時に解決するようだと1かどうかの判定が増えて遅くなる。
35 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 12:11:16.71 ID:OMlKC5pQ.net] TCPIPのソケット通信プログラム作ろうと思っているのですが、 コネクションを維持し続ける場合のデメリットって何がありますか?
36 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 12:42:43.27 ID:ZRv1Vy3I.net] >>32 後出しになって申し訳ありませんが、*、!=、++、+=、- 辺りが定義されたイテレータを持つ自作のデータ構造を範囲for文で走査することを考えています それ自体は想定した通りにできたのですが、その範囲for文をomp並列化するとイテレータのインクリメントが ++ でなく
37 名前: +=1 で行われるようになります で、その自作データ構造では ++ よりも += の方が重い実装になっているので、+=1 よりは ++ の方を使ってほしいです omp に特有の仕様に思えるので、普通に += の冒頭で引数が1かどうかの分岐を入れることにしようかと思います ありがとうございました [] [ここ壊れてます]
38 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 14:57:46.78 ID:W7aMf5pX.net] マルチスレッドのキューのサンプルをSTLで作りゃったーしたったわ、 https://ideone.com/bS7rqc ↓ここのC#のサンプルプログラムの移植 // https://atmarkit.itmedia.co.jp/ait/articles/1801/31/news023.html フラグの必要性は意味を取り違えていたわサーセン、 しかしこれフラグ(runningFlag)無しでやるとしたら終了時にConsumerがいちいちProducerが join可能か調べる(std::thread::joinable())ことになってスレッドより先にプログラムした人が終了したくなるお フラグで済むのに、
39 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 15:21:27.23 ID:W7aMf5pX.net] Windowsのイベントオブジェクトと条件変数の違いまとめ https://dev.activebasic.com/egtra/2011/09/19/413/
40 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 15:28:07.54 ID:W7aMf5pX.net] と思ったがやっぱ当初の意味(Producerが待っているのかどうか)のフラグが無いと、 キューが空になった後のnotifyで、1万個あるかもしれない仕事の無いConsumerが次々起床され、 巡り巡ってようやくProducerが起床されるみたいな非効率が生じる余地があるやんけ;;; やっぱ当初の漏れのフラグ必要という意見で正しかったのかもしんない 漏れは天才なのかもしんない、 かもしんない運転、
41 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 18:25:35.80 ID:W7aMf5pX.net] つかその前に、漏れの天才eyesが改造元とした@IT様のサンプルプログラムに スレッドのディスパッチ依存で終了できなくなることがあるという恥ずかしいバグを発見した、 論より証拠: https://ideone.com/NbKdEQ 変更点は、Consumerを1個にして、Producerの側のある個所にsleepを入れただけ (マクロ CAUSE_STOPPING_FAILURE_BUG で条件コンパイルで有効にしている個所 これでConsumerスレッドが終了できなくなる 対策は、同ソースコードの BUGFIX_STOPPING_FAILURE_BUG マクロを有効にしたら宜しい 天才の判断である
42 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 18:42:35.68 ID:mYAwPqTL.net] >>34 すみません。この件なんですが、 void operator += (int n){ if(n == 1){ // ここ }else{ …… } } 「ここ」で演算子++を呼びたいときってどう書いたら良いでしょうか ++の中身をコピペしても良いのですが、 this -> ++ みたいなノリで呼び出せた方が都合が良いです
43 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 19:06:35.71 ID:W7aMf5pX.net] というわけで最終的な版を貼る、 https://ideone.com/G3XeAg ProduceとConsumerそれぞれに対する起床条件を分離すた、 日本語ではいくら説明しても一向に理解の光が射さなかったボンクラ学生レヴェルの>>15 でも 100行足らずのソースコードなら読めるんじゃないの 知らんけど
44 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 19:11:32.09 ID:cMFKuo8t.net] >>39 ++(*this); または this->operator++();
45 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 19:24:28.15 ID:mYAwPqTL.net] >>41 ありがとうございます 前置/後置の別が自分
46 名前:フ中でよく付いていませんが、教えていただいたことに基づいて調べてみます [] [ここ壊れてます]
47 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 19:37:16.72 ID:Lbev+Y0v.net] >>40 で、そこで取れると良い「スレッドの実行状態」って結局何なん?
48 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 20:32:27.09 ID:W7aMf5pX.net] 「スレッドの実行状態とは起こす対象のスレッドが具体的に何をしているか、や とれると良い、ではなく取ることが必須や なぜなら、WIN32APIのイベントは1回だけキューイングされるので投げたら投げっぱなしでもそのうち 受け取ってもらえるが、(pthread系統のしくみである)状態変数はそうではなく、 起床信号を投げつける前に相手が信号をキャッチ可能なのか(待ちに入っているのか)知る必要がある なお、イベントのキューイングの有無によって話が変わる旨はすでに書いたある(>>997 上記のことを書いてあるというのに理解もせずにしつこく同じことを繰り返し言ってきたのが>>15
49 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 21:01:08.35 ID:Lbev+Y0v.net] >「スレッドの実行状態とは起こす対象のスレッドが具体的に何をしているか、や それって具体的にどういうものを想定しているんだろう。 もともとの話はstd::threadに追加したい機能だったと思うけど、この説明だけじゃ全然想像がつかない。
50 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 22:11:54.85 ID:W7aMf5pX.net] なんか元にしたコードにまだ問題があった気配orz MAX_QUEを1にすると高い頻度でProducerとConsumerが両方待ちに入ってしまいハングアップする、、、 対策版は多分これ↓で良いんジャマイカ…… https://ideone.com/at7ef9 (何が起きていて、どうしてこれで対策なのかはコメント参照、 >>45 >>「スレッドの実行状態とは起こす対象のスレッドが具体的に何をしているか、や >それって具体的にどういうものを想定しているんだろう。 今回のサンプルコードでは具体的にはありません(キリ しいて言えば!runningFlagならConsumerが自身を待ちに入れない(∵Producerがもう起こしてはくれない というのはあるが、>>35 に書いた通りフラグ以外の方法でも同じ判定を行える 言っていることにブレがあるのは今日pthreadを勉強したばっかりやし、 天才なので大目に見てホスイ、
51 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 22:25:26.70 ID:W7aMf5pX.net] でもまあコメントを読んでいただければ、pthread系のしくみだと 起こす対象のスレッドが何をしているのかについて常に配慮が居るということをご理解いただけるのではないかと思う 今回はたまたま見込みでnotifyして話が通るからスレッドの実行状態を表す変数が具体的に生じなかっただけ
52 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 22:47:59.90 ID:C0wcAbjz.net] すみません。 自作プログラムが特定のPCだけ同じ場所でntdll.dllのエラーで止まるのですが、何が原因と考えられるでしょうか? 他のPCでは問題無く進み、エラーを起こすPCのメモリにも異常は見つかりませんでした。
53 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 23:06:02.90 ID:OOQ3UOoB.net] >>48 未初期化変数があって無効なアドレスにアクセスしたとかじゃね 確実なことを言うためには例外コードが知りたい あと問題の箇所のソースコードも
54 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 23:24:57.75 ID:C0wcAbjz.net] ソースはすみません、ちょっと出せないです エラーコードは0xc0000005でしま
55 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 23:30:51.53 ID:OOQ3UOoB.net] はいメモリアクセス違反ですね デバッガでがんばって調べてね
56 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 23:32:41.60 ID:C0wcAbjz.net] あざす
57 名前:デフォルトの名無しさん [2021/08/10(火) 23:34:52.75 ID:5fGESjxl.net] 他の言語にはスレッド実行中か判定するAPIあるしstd::thread作った人達だってそのくらいのこと知ってたでしょ boost::thread時代にそういった要望もあっただろうし それでもあえてstd::threadにはスレッド実行中を調べる機能を付けなかった 本質的に必要な機能ではないと
58 名前:判断したんじゃないの? [] [ここ壊れてます]
59 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 23:44:13.15 ID:rk6SLsdN.net] スレッドそのものの終了状態を知る需要はあまりなく、スレッド内で行われるユーザー定義処理が終わったかどうかが重要だからでしょ
60 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 23:50:54.98 ID:Lbev+Y0v.net] >>47 >起こす対象のスレッドが何をしているのかについて常に配慮が居るということをご理解いただけるのではないかと思う それがwaitで待っている状態かそうでないかを意味しているんだとしたらそれは正しくない。 チェックした次の瞬間にwaitする可能性もあるわけなんで。
61 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 01:24:38.33 ID:qkzYmFIh.net] >>55 >チェックした次の瞬間にwaitする可能性もあるわけなんで。 無い チェックと処置をmutexによる単一のロック期間の中でアトミックに行うのだから>>55 は全くナンセンスな問題提起 >>53 thread::joinable()があることは書いたもーん
62 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 01:28:13.23 ID:qkzYmFIh.net] 問題だらけだった@IT様のサンプルコードだけど これまともに実装するとしたら条件変数をConsumer x NとProducerの計N+1個設けて、 さらにConsumerそれぞれが待っているのか動いているのかを示すフラグを設けて 全部動いていたらProducerを待たせる Consumerが待ちに入る直前にProducerにnotifyかけてキックする、みたいな スレッドプールを手で実装するみたいな話になりそう…… でここまでやるならConsumerの状態変数が実体としてコードに現れる
63 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 01:44:51.77 ID:01hIEDa4.net] 何を主張したくてごちゃごちゃ言ってるのかさっぱり見えないし途中で変わったりしてるようでもあるので、 続けるならそもそもどういう主張をしているのかいっぺんまとめてほしい。
64 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 08:13:22.18 ID:SyYdmIb8.net] >>56 std::threadから取得する「スレッドの実行状態」の話をしているんだが。 それをmutexでアトミックに操作する???
65 名前:デフォルトの名無しさん [2021/08/11(水) 09:56:36.95 ID:8ERcfmko.net] C++ってiPhoneアプリ作れる?
66 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 12:11:01.26 ID:sOdrsbt7.net] >>60 作れる。QtやUnityで。
67 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 12:13:04.52 ID:sOdrsbt7.net] iPhone専用でいいなら、そもそも、Appleが提供している標準開発環境だけでも C++で作れる。 iPhoneの標準開発言語はSwiftだが、SwiftはC++と相互に呼び出せるから。 ただし、それだけだと面倒かも知れない。 そういう場合は、Qtで作れば。
68 名前:デフォルトの名無しさん [2021/08/11(水) 12:52:41.17 ID:MU7UJMps.net] std::vector で insert するとき v.insert(v.begin() + n, hoge); とかすると思いますが このときの n の型って何ですか? int ? unsigned long ? size_t ? あとこういう型を調べるときって vector のどことか iterator のどこを調べると判りますか?
69 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 13:03:37.14 ID:19rzwYjH.net] 22.3.11 Class Template vector 23.3.11.1 Overview 3 using iterator = implementation-defined; //see 22.2 となっていて、std::vector::iteratorの型は処理系定義だね 現物で調べるならVisual Studioの[F12]が簡単だと思う
70 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 14:01:06.77 ID:OqxISI0I.net] >>59 ID:W7aMf5pX = ID:qkzYmFIh はスレッドの状態として ・その瞬間の状態: Run/Ready/Wait/... ・終了してるかどうか: thread::joinable で取得できる を混同してる(わざとかどうかは知らんが) あと条件変数とスレッドの状態も混同してるので > チェックと処置をmutexによる単一のロック期間の中でアトミックに行うのだから なんて意味不明なことを言い出してる これ以上続けるなら>>58 が言うように本人にまとめてもらわないとますますグダグダになるだけだと思う
71 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 14:15:21.29 ID:EWMgwFeS.net] std::thread使ったことないから自信無くて黙ってた
72 名前:ッど thread::joinable()って別にスレッドが終了したかの判定ではなくない? 他スレッドでの実行を管理していない状態の(空の)オブジェクトが作れるから、そういう空の状態かどうかの判定関数であるように読めた fstream::is_open()的な…… [] [ここ壊れてます]
73 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 14:23:39.88 ID:01hIEDa4.net] >>63 暗黙変換があるから n の型としてはすべての整数型があり得る。 基本的には、生ポインタで実装される可能性もあるものなので ptrdiff_t だと思っておけばいい。 正確な型が必要なら difference_type とか iter_difference_t とかで調べればわかる。
74 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 14:56:54.71 ID:OqxISI0I.net] >>66 > thread::joinable()って別にスレッドが終了したかの判定ではなくない? もちろん正確にはスレッド変数がスレッドと関連づいてるかどうかの判定 彼は>>35 辺りでスレッド終了判定と思い込んでるフシが見られるのでそう書いてある
75 名前:デフォルトの名無しさん [2021/08/11(水) 15:08:15.20 ID:MU7UJMps.net] >>67 ありがとうございます >>64 >現物で調べるならVisual Studioの[F12]が簡単だと思う それで判るのは自分で定義した可能性の高い n の型ですよね? 知りたいのは v.begin() + n に要求されている型のことです
76 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 15:28:09.46 ID:EWMgwFeS.net] >>68 やっぱりそうですよね じゃあ>>65 の2個目の中黒の内容については引用?? 例のコードではjoinableなんか使ってないし>>7 が書いたのを試しもせずに真に受けた感じなのかな
77 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 15:29:37.31 ID:EWMgwFeS.net] >>69 v.begin().operator+(n)とでも書き換えてoperator+で[F12]しろということではなかろうか
78 名前:はちみつ餃子 mailto:sage [2021/08/11(水) 15:43:43.66 ID:QcAq7ivU.net] >>69 ランダムアクセスイテレータには difference_type (またはそれに暗黙に型変換出来る何か) を足すことができて、 その結果の型はイテレータ自身と同じ。 https://timsong-cpp.github.io/cppwp/n3337/random.access.iterators
79 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 15:52:06.26 ID:SyYdmIb8.net] >>66 >thread::joinable()って別にスレッドが終了したかの判定ではなくない? 実際にそのスレッドが実行中か待ちか終了しているかを表しているわけじゃないことはその通り。 で、たぶんそれで十分だからjoinable以上の機能は用意されなかった。 ところがそれが役に立つ場面があるよと言ったのが前スレ>>997 このスレの>>35 と同一人物かどうかは知らんが。
80 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 15:54:21.05 ID:19rzwYjH.net] >>71 そういうこと
81 名前:デフォルトの名無しさん [2021/08/13(金) 02:38:58.72 ID:tLa9gek2.net] char *mystrcat(char *a, char *b) { // a に b を結合して return a; } みたいな関数を shared_ptr<char *> mystrcat(shared_ptr<char *> a, char *b) { // a に b を結合して return a; } みたいな実装にするとき参照カウンタが無限に増える心配はありますか? shared_ptr<char *> mystrcat(weak_ptr<char *> a, char *b) の方が良いのでしょうか? あと hoge = mystrcat(NULL, hage); みたいに使用されるときは mystrcat の中で new してコピーして new したポインタを返したいのですが問題ありませんか?
82 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 02:56:15.88 ID:nopi39s7.net] >>75 shared_ptr<char *> だと、たぶんやりたいことはできてない。 shared_ptr<char[]> の間違いなんだろうと思うけど、この時点でコンパイルすら試してないのが見て取れる。 参照カウンタの動きは挙げられたソースだけじゃ読み取れないけど、無限に増えるなんてことはまず起こらない。 shared_ptr の use_count() で取れるから試してみればいい。 問題があるかどうかも自分で試してみればいい。何を「問題」とするかこちらにはわからないし。
83 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 09:51:25.31 ID:BE9FMbqU.net] 個別の事例で心配ない、問題ないという返答を得たとしても理解が深まらない。 shared_ptr のメカニズムを理解できないと何度でも心配になるだけ。
84 名前:ヌういう理屈で参照カウンタが無限に増えると思ったのかを説明してみて。 考え方に間違いがあれば指摘するよ。 [] [ここ壊れてます]
85 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 11:40:57.21 ID:UG8FRdqC.net] char *mystrcat(char *a, char *b) { // a に b を結合して return make_shared<char []>(a); } じゃいかんの しらんけど
86 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 14:30:41.36 ID:vEVo7A6C.net] 適当な質問者と適当な回答者 ゴミとゴミをあわせてもゴミはゴミ
87 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 18:27:35.00 ID:tLa9gek2.net] shared_ptr<char []> c(a); return &c[0];
88 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 08:57:21.71 ID:dlgzlAXX.net] namespaceってどのように使うものなんですか? 存在意義がわからない。
89 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 09:56:52.00 ID:2Gpa2MRC.net] >>81 大規模ライブラリを設計するときに重宝する機能 詳しい経緯は知らないがグローバルスコープの識別子名の競合を回避する目的で導入されたと思う namespaceがないC言語時代にいくつからの大規模ライブラリを組み合わせたときに何が起きがちだったか知っていれば納得出来るはず どんな機能もそうだが、自分が必要と思った時に使えば良いだけだよ 存在意義が分からないならお前にとっては必要のない機能ということだから、気にする必要はない
90 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 10:45:32.18 ID:MjnqNUAd.net] Cにnamespaceが導入されないのは何故なんです?
91 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 10:48:18.77 ID:isR1pnnS.net] >>75 蛇足だけど、理由がなければshared_ptr<char[]>の代わりにshared_ptr<str>にしたほうがいいな。 // a に b を結合して return a がすごく怖い。
92 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 11:05:20.03 ID:HmVXtcJk.net] >>83 namespace
93 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 11:07:32.50 ID:HmVXtcJk.net] >>83 namespaceを導入するということは :: だのマングリングだのADLだの色々付いてくるからな
94 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 11:09:29.69 ID:sh47n3w4.net] >>83 マングリングが必要になってしまうから、ってのが大きいだろうな。
95 名前:デフォルトの名無しさん [2021/08/14(土) 11:16:28.29 ID:Wd8wuOU/.net] C++を本格的に学ぼうと思って本を数冊買ったが、言語仕様が複雑な割には知らないとエラー起こすだろ っていう項目が多くてビビってる。あと、きれいなコードを書くのに尋常じゃない経験が必要なんじゃないか
96 名前:はちみつ餃子 mailto:sage [2021/08/14(土) 11:34:44.96 ID:xM4RG8+9.net] 全部知らなくてもわかる部分だけでまあまあ使えるというのが C++ の方針なので 最初から綺麗に書こうと思わないほうがいいと思う。 綺麗に書けないと考えるより汚くても普通なんだと考えると気が楽でしょ。
97 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 11:41:20.52 ID:HmVXtcJk.net] 構造体の中に関数が書ける、というコアの中のコアな部分の使い方・考え方さえ憶えるというより慣れれば あと他のは追加で憶えればいいってだけ ただし、その追加が今とんでもない量になってて 禿本の初版からやってる俺でさえ憶えきれなくてもがいてる
98 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 11:47:19.11 ID:fhp8ilcT.net] いいかい学生さん、 他人のコードをな、 他人のコードをいつでも読めるくらいになりなよ。 それが、人間えら過ぎもしない貧乏過ぎもしない、 ちょうどいいくらいってとこなんだ。
99 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 13:15:40.19 ID:MjnqNUAd.net] >>88 エラーが起こったらまだマシだな イクときはだまってイクからな
100 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 13:23:47.33 ID:sh47n3w4.net] 他人のコードを読んで学ぶのに一番向いてない言語だよなC++は。