問題タブ [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 投票する
4 に答える
12232 参照

c - セマフォ操作を待機しているスレッドを終了するにはどうすればよいですか

ipc に共有メモリとセマフォを使用するプログラムを作成しています。共有メモリとセマフォを作成するメイン サーバー プロセスが 1 つあります。クライアント プロセスはいくつでも共有メモリにアタッチでき、許可されている場合は読み書きできます。セマフォは、読み取りと書き込みを制御するブロッキング メカニズムを提供します。クライアントを終了しようとする場合を除いて、すべて正常に動作します。共有メモリにアクセスするためのセマフォ ブロックはスレッド内にあり、プロセスの終了時にセマフォ ブロックを解放する方法がないため、スレッドは正しく終了します。これについてどうすればいいですか?これは Linux 用です。

具体的には、1 つの shm と 2 つの sem があります。最初の sem は書き込みをブロックし、2 番目のブロックは読み取りをブロックします。クライアントが何かを書き込む場合、クライアントは write sem が 0 になるのを待ってから、それを 1 に設定し、書き込み、次に read sem を 0 に設定します。これにより、待機しているサーバーが解放され、クライアントが書き込んだ内容が読み取られます。読み取りが完了すると、サーバーは書き込み sem を 0 に戻し、次のクライアントが書き込みを開始します。read sem が 0 のときに解放される semop 呼び出しでハングします。この semop 呼び出しはスレッド内にあり、メイン スレッドを終了させる前にそのスレッドを正しく終了する方法を理解する必要があります。

これは私がやりたいことの例ですが、機能していません (スリープはぶら下がっている semop 呼び出しのふりをしています):

0 投票する
9 に答える
111735 参照

c++ - クラスからのpthread関数

私が次のようなクラスを持っているとしましょう

そして、私はcのベクトルを持っています

今、私はスレッドを作成したいc.print();

そして、以下は私に以下の問題を与えています:pthread_create(&t1, NULL, &c[0].print, NULL);

エラー出力:引数「3」の「void *(tree_item :: )(void)」を「void *()(void )」に変換できません」int pthread_create(pthread_t *、const pthread_attr_t *、void *( )(void)、void *)'</ p>

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

pthreads - WatiForMultipleObjects に相当する pthread はありますか

2 つのスレッドを生成し、両方が完了するまで待機する次の Windows コードがあります。

私は現在、pthreads を使用するために同じコードを移植していますが、同等のことを行う方法がわかりませんWaitForMultipleObjects:

同じ機能を実現するために、pthreads を使用する同等の方法はありますか?

0 投票する
3 に答える
1326 参照

c - スレッドプールとは何ですか?

Thread-pool (pthreads の助けを借りて C で) を実装する概念は何ですか? スレッドプールから実行するようにスレッドを割り当てるにはどうすればよいですか?

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

iphone - iPhone:マルチタスク、マルチスレッド?

iPhoneはマルチタスクとマルチスレッドをサポートしていないと言われました。これは私には意味がなかったので、シミュレーターでテストしました。pthreadsは機能しますが、fork()は機能しません。この結果私には理にかなっていますが、今はわかりません。pthreadライブラリは実際のデバイスでも機能しますか?

ありがとう。

0 投票する
3 に答える
704 参照

c++ - pthread_exit が C++ ソースではなく C ソースから呼び出された場合、キャンセル ハンドラが実行されない

C++ ソースを C ソースおよび C++ ソースとリンクしています。キャンセル ポイントである pthread を使用してスレッドを作成し、C または C++ ソース ファイルを介して pthread_exit を呼び出します。

pthread_exit 呼び出しが C ソースからのものである場合、キャンセル ハンドラは起動しません。この理由は何ですか?

b.cc:

vpp.cc:

VC:

対:

でのコンパイル

PTHREAD_EXIT が Vpp の場合、プログラムはメッセージを表示して終了します。V または Vs の場合は表示しません。

V と Vpp の逆アセンブルは同一であり、V と Vpp の間で PTHREAD_EXIT の定義を変更しても、逆アセンブルの間call Vcall Vpp逆アセンブルで変更されるだけです。

編集:別のコンピューターでは再現できないため、ライブラリまたは何かでエラーが発生したと思います。

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

c - C のマルチライター スレッドセーフ キュー

pthreads を使用してマルチスレッド C アプリケーションに取り組んでいます。データベースに書き込む 1 つのスレッド (データベース ライブラリは単一のスレッドでのみ安全に使用できます) と、データを収集して処理し、結果をデータベース スレッドに送信して保存する必要があるいくつかのスレッドがあります。C で複数ライターのセーフ キューを作成することは「可能」であると言及されているのを見てきましたが、これについて言及されているすべての場所で、「この例では複雑すぎる」と単純に述べられており、単一ライターのセーフ キューを示しているだけです。 .

次のものが必要です。

  • 効率的な挿入と取り外し。他のキューと同様に、O(1) のエンキューとデキューが可能であると想定します。
  • 動的に割り当てられたメモリ、つまりリンクされた構造。キューのサイズに恣意的な制限を設ける必要はないので、配列は実際には探しているものではありません。

編集:読み取りスレッドは、空のキューでスピンしないでください。書き込みがなく、多数の書き込みの短いバーストが数分ある可能性があるためです。

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

multithreading - POSIX スレッドを理解する

POSIX スレッドについて混乱しています。Pthreads についての私の理解が適切かどうかを知りたいのですが、

私によると、マルチスレッドの処理に役立つネイティブ層の上の層です。これは、ある OS から別の OS への移植に役立つ共通の構文を提供します。さまざまな OS 固有の構造を内部的に処理します。

間違っている場合はお知らせください。見逃した点を追加してください。

0 投票する
3 に答える
1859 参照

c - pthread_cond_wait と pthread_cond_signal で譲歩を保証

グローバル変数、ミューテックス、条件変数を共有する 3 つの POSIX スレッドを持つ C プログラムがあり、そのうちの 2 つが次の疑似コードを実行しているとします。

そして3回目の実行:

3 番目のスレッドが最初の 2 つのスレッドのそれぞれからのデータを見ると仮定しても安全でしょうか?

別の言い方をすれば、スレッドがミューテックスと条件変数を待機している場合、ロックを待機している可能性のある他のスレッドではなく、シグナルが送信された場合にロックを取得する次のスレッドであると想定しても安全ですか?ロック?

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

linux - Linux で 1 つのスレッドの UID/GID のみを変更する

マルチスレッド プロセスで 1 つのスレッドのみの UID/GID を変更する方法はありますか?

この理由は、ファイル サービス アプリケーションを作成するためです。呼び出し元の uid/gid が正しいユーザーに設定されていない限り、ACL とクォータは適用されず、新しいファイル/ディレクトリは正しい uid/gid で作成されません。

通常、ネットワーク アプリケーションは最初に自分自身を fork() し、各ユーザー リクエストを個別のプロセスで処理します。共有データが必要な場合は、何らかの共有メモリを経由する必要があります。ただし、たとえば、FUSE (Linux ユーザー ファイルシステム) はデフォルトでマルチスレッドを使用し、Python バインディングと組み合わせてフォーク モデルを使用するのは現実的ではありません。

プロセス全体の「一貫した」UID は POSIX 標準に従っているようですが、古い Linux は POSIX に従っておらず、スレッドごとに異なる uid を許可していました。新しいカーネルは POSIX に従っているようですが、古い「壊れた」動作を許可する方法はありますか?