問題タブ [pthreads]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1831 参照

c - pthreadが終了したときにプロセスが終了しないようにするにはどうすればよいですか?

私はCでサーバープログラムを作成しています。このプログラムでは、クライアントが接続するたびに、クライアントの要求を処理するための新しいpthreadを作成します。

ただし、すべてのスレッドが終了すると、exit()が呼び出されたかのように、プログラムが終了します。これは問題です-どうすればそれを克服できますか?

サーバーが稼働していて、2つのクライアントが接続しているとします。これらのクライアントが切断されると(つまり、両方のスレッドが終了すると)、サーバープロセスが終了します。私が欲しいのは、サーバーがソケット要求をaccept()し続けることです。通常、これはfork()とaccept()を使用すると機能します。親プロセスが無限にループするのではなく終了するように、私は何を間違っていますか?

コードは基本的に次のようになります。

また、これは私がすでに尋ねた質問(以下にリンク)からの同じプロジェクトです... select()とIPCの使用に多くの時間を費やした後、失敗した後、私はスレッドに渦を巻くと思いました共有アドレス空間。

親子IPCにCでパイプを使用すると、プログラムがブロックされます

また、このコードの多くはここから取得されました:http ://www.s5h.net/2006/06/27/pthread-socket-server-in-c/

0 投票する
2 に答える
1167 参照

linux - Linux スレッドのリソース リーク?

マルチスレッド Linux アプリケーションの 1 つで、スレッドを削除せずにアプリケーションが終了します。これにより、スレッド リソースのリークが発生しますか。このアプリケーションを 1 日のうちに何度も起動すると、システムがクラッシュしますか?

0 投票する
1 に答える
9826 参照

c - 関数ポインタを使用してスレッドからコールバックを呼び出す

c プログラム コンパイラ gcc

私は3つのファイルを持っています。main.c stop_watch.h および stop_watch.c

このプログラムは機能します。start_stopwatch を呼び出します。そして、時間の経過後に main.c timeout_cb() でコールバックします。実行する必要がある他のコードがあるため、メインでブロックしたくないので、これも別のスレッドで実行します。

1) g_start_timer の秒は常にゴミになります。ヒープ上に構造を作成することでこれを解決できたのではないかと思いました。とにかく私はこれを解決することができますか?ヒープに秒要素を作成することを考えていました。しかし、これはやり過ぎだと思います

2) このプログラムは問題なく動作しますが、メインの printf("=== timeout_cb: %p\n", timeout_cb); の行をコメントアウトすると、スタックダンプになります。

3) メモリを解放するのに最適な時期はいつですか。メインで解放していました。しかし、スレッドが終了する前にメモリが解放されると心配です。これにより、非常に予期しない結果が生じる可能性があります。この呼び出しの後、メモリを解放するために thread_join() を使用できると考えています。ただし、stop_watch.c で作成された thead_id を返す必要があります。stop_watch.c で作成された thread_id を返す方法はありますか

ご提案いただきありがとうございます。

main.c

stop_watch.h

stop_watch.c

0 投票する
2 に答える
4845 参照

c - pthreads で共有変数を読み書きするにはどうすればよいですか?

LinuxでC pthreadsを使用して、2つのスレッドがあります。1 つはデータを書き込み、もう 1 つはそれを読み取ります。変数を使用して、読み取りが許可されているときに読み取りスレッドを許可し、許可されているときに書き込みスレッドを許可しています。したがって、ミューテックスは「newData」と呼ばれるこのブール変数に適用されます。私の質問は、「if」条件内のアクセスの周りでミューテックスをロック/ロック解除する必要がありますか? どちらの方法でも機能しますが、この変数に対して書き込み/読み取りが重複する可能性が非常に低いという理由だけで考えています。私の質問をよりよく説明するために、両方の選択肢を示します。

スレッド 1:

スレッド 2:

2 番目のバージョンは機能しますが、正しいかどうかはわかりません。

スレッド 1:

スレッド 2:

0 投票する
2 に答える
2617 参照

c - pthread コールバックがユーザー入力を中断する

独自の stop_watch モジュールを作成しました。これにより、スレッドが作成され、数秒間スリープ状態になります。秒が経過すると、main.c でコールバック関数が呼び出され、ユーザーに時間が経過したことが通知されます。

これは、ユーザーが数字を入力するのに 3 秒しか与えられず、5 桁を入力する必要があるようにするためです。期限が切れた場合、プログラムは停止する必要があります。

2つの問題。1) 所要時間内に数字を入力した場合。スレッドをキャンセルするにはどうすればよいですか。thread_kill または thread_cancel を使用することを考えていましたか? 2) do_while ループで終了するにはどうすればよいですか? ユーザーが入力するのを待っている間、scanfはブロックします。

ご提案いただきありがとうございます。

以下の私のコード:

ちなみに、この質問はC99 gccに関するものです。

0 投票する
7 に答える
5467 参照

multithreading - より多くのスレッドを使用すると、プログラムの実行が遅くなる原因は何ですか?

この質問は、私が以前に尋ねたのと同じプログラムに関するものです。要約すると、次のようなループ構造を持つプログラムがあります。

bin_indexこの質問の目的のために、共有状態を使用または変更しない、その引数の完全に決定論的な関数です。つまり、明らかに再入可能です。

私は最初、単一のスレッドを使用するためにこのプログラムを書きました。n次に、スレッドが外側のループのすべての反復を実行するように、複数のスレッドを使用するように変換しましたi1 % nthreads == n。したがって、各スレッドで実行される関数は次のようになります

すべてのthread_local_histograms は、最後にメインスレッドで合計されます。

奇妙なことに、ある特定のサイズの計算に対して 1 つのスレッドだけでプログラムを実行すると、約 6 秒かかります。2 つまたは 3 つのスレッドで実行し、まったく同じ計算を行うと、約 9 秒かかります。何故ですか?デュアルコア CPU を使用しているため、2 つのスレッドを使用する方が 1 つのスレッドよりも高速であると予想されます。プログラムはミューテックスやその他の同期プリミティブを使用しないため、2 つのスレッドを並行して実行できるはずです。

time参考までに: 1 つのスレッドの典型的な出力(これは Linux 上にあります):

および 2 つのスレッド:

コードはhttp://static.ellipsix.net/ext-tmp/distintegral.ccsにあります。

PS まさにこの種のもののために設計されたライブラリがあり、おそらくパフォーマンスが向上する可能性があることは知っていますが、それが私の最後の質問でしたので、それらの提案をもう一度聞く必要はありません。(さらに、pthreads を学習体験として使用したかったのです。)

0 投票する
1 に答える
913 参照

embedded - pthread_cancel は arm と ppc で異なる動作をしますか?

現在、arm および ppc アーキテクチャに展開されるマルチスレッド アプリケーションに取り組んでいます。アームの pthread_cancel に問題があります。

arm の pthread_cancel は、ppc と同じように動作しません。スレッドはキャンセルされますが、スレッドのローカル変数のデストラクタがアームで呼び出されていません。また、pthread_cleanup_push を介してインストールされたキャンセル クリーンアップ ハンドラ ルーチンを明示的に定義しようとしました。しかし、スレッドがキャンセルされたときに呼び出されていません。

コードは ppc で正常に動作します。スレッドがキャンセルされると、ローカル変数のデストラクタが呼び出されます。また、クリーンアップ ハンドラーを明示的に定義すると、pthread_cancel が呼び出されたときに呼び出されて実行されました。

何か不足していますか?おそらくいくつかのコンパイラオプション?

  • プログラミング言語: C++
  • コンパイラ: arm-linux-g++/powerpc-linux-g++
  • OS: リナックス

編集:

私は、このlibc bugに記録された、一種の同様の問題を発見しました。

g++ の代わりに gcc を使用し、 -fno-exception コンパイラ オプションを追加するとうまくいきました。しかし、私は本当にこの問題の背後にあるものを理解したいと思っています. さらに、-fno-exception は、アプリケーションで例外処理を実行できないことを意味します。現在使用しているわけではありませんが、将来使用する可能性があります。

ありがとう。

0 投票する
2 に答える
809 参照

c - pthreadedプログラムをMPIに変換しますか?

マルチスレッドプログラムとマシン間通信に依存するプログラムの違いを理解しています。私の問題は、「C」で書かれた素晴らしいマルチスレッドプログラムがあり、8コアマシンで非常にうまく機能することです。より多くのコアにアクセスするために、このプログラムをクラスターに移植する機会があります。pthreadのものを取り除いてMPI(私が使用したことのないもの)を改造することは努力する価値がありますか、それともすべて(またはそのほとんど)を最初から再コーディングする方が良いですか?私たちがCに「行き詰まっている」ので、言語を大幅に変更することはできません。

0 投票する
1 に答える
24929 参照

c - C プログラムのコンパイル時のエラー

セマフォを使用する学校向けのプロジェクトを完成させようとしています。適切なヘッダー ファイル (および pthread 用の 1 つ) を含めました。コンパイラに適切なライブラリも指定しました。これは C で書かれています。はい、これは割り当てですが、私は実装の助けを求めているのではなく、この忌まわしいコンパイル エラーを理解できないようです。

私のコードの 47 行目から 50 行目は、セマフォの「単純な」宣言と初期化です。

48 行目でコンパイルしようとしたときに表示されるメッセージは次のとおりです。50 行目でも同じセットが得られますが、簡潔にするために投稿しませんでした。

これらはすべて main() 関数の外で宣言しました。これらのエラーを解決するにはどうすればよいですか? sem_t のデータ型がないことを示しているように見えるので困惑していますが、semaphore.h で定義されており、これを含めました。gccを使用しているUbuntuでCode::Blocksを使用してこれをコンパイルしています。このエラーは、コマンド ラインからコンパイルしても発生します。

助けてくれてありがとう。

0 投票する
4 に答える
15596 参照

c - pthread_cond_timedwaitがすぐに戻る

奇妙な問題があります。私は次のコードを持っています:

dbggettimeofdayすべての行の前に呼び出し、行の前に時間を追加します。その結果、次の出力が得られます。

ご覧のとおり、2つのデバッグ行の間を通過したのはわずか7マイクロ秒ですが、pthread_cond_timedwait返されETIMEDOUTます。これはどのように起こりますか?cond変数を初期化するときに、時計を別のものに設定しようとしました。

(エラーメッセージは印刷されません)。CLOCK_REALTIMEとの両方を試しましCLOCK_MONOTONICた。

このコードはブロッキングキューの一部です。5秒以内にこのキューに何も入れられない場合、何か他のことが起こるような機能が必要です。を使用しない場合、ブロッキングキューは正常に機能するため、ミューテックスと条件は両方とも初期化されますpthread_cond_timedwait