de-vraag
  • 質問
  • タグ
  • ユーザー
通知:
報酬:
登録
登録すると、質問に対する返答やコメントが通知されます。
ログイン
すでにアカウントをお持ちの方は、ログインして新しい通知を確認してください。
追加された質問、回答、コメントには報酬があります。
さらに
ソース
編集
 MetallicPriest
MetallicPriest
質問

フォーク後にデッドスレッドを再作成する

ご存じのように、アプリケーション内のすべてのスレッドは、フォークを実行しているスレッド以外のforkしたプロセスで停止します。しかし、私は、 pthread_create を呼び出し、 pthread_attr_setstack を使用して、新しく作成されたスレッドにデッドスレッドと同じスタックを割り当てるように、フォークされたプロセスでそれらのスレッドを再確立する予定です。次のようなもの。

// stackAddr and stacksize taken from the dead thread    
pthread_attr_setstack(&attr, stackAddr, stacksize);
rc = pthread_create(&thread, &attr, threadRoutine, NULL); 

しかし、私はまだ同じポイントからスレッドを再起動するために、スタックポインタ、ベースポインタ、命令ポインタなどのCPUレジスタ値を取得する必要があります。どうやってやるの?私の目標を達成するために他に何が必要ですか?

また、私は64ビットアーキテクチャを使用しています。 32ビットのものと比較して、それにはどんな追加の困難がありますか?

7 2011-10-27T15:42:22+00:00 3
 MetallicPriest
MetallicPriest
編集された質問 27日 10月 2011 в 3:47
プログラミング
linux
c
fork
x86
64-bit
ninjalj
27日 10月 2011 в 6:12
2011-10-27T18:12:21+00:00
さらに
ソース
編集
#56790235

私は足に自分自身を撃って髪を失う2つの可能な方法を見ています^ W ^ W ^ W ^ W ^ W ^ W ^

  • 各スレッドを fork()の前に getcontext()を呼び出すように強制してから、 setcontext()コード>。おそらく動作しませんが、あなたは楽しみにしてみることができます。
  • ptrace(PTRACE_GETREGS)、 ptrace(PTRACE_GETFPREGS) 。
3
0
Chris Dodd
27日 10月 2011 в 6:17
2011-10-27T18:17:02+00:00
さらに
ソース
編集
#56790236

現在のプロセス内の他のスレッドは、フォークによって殺されません。それらはまだそこにあり、親プロセスで実行されています。現在のプロセスでは、 fork は1つのスレッドのみをフォークし、親プロセス内のすべての非スレッドリソースのコピーを持つ1つのスレッドを実行する新しいプロセスを作成するという問題があります。

あなたが望むのは、マルチスレッド・タスク全体を複製し、その中のすべてのスレッドをフォークし、同じ数のスレッドで新しいプロセス/タスクを作成する方法です。

THATを実行するには、プロセス内の他のスレッドをすべて見つけて一時停止し、現在の状態(保持しているすべてのロックを含む)をダンプし、新しいプロセスをforkしてから、その子は、必要に応じて新しい子スレッドを参照するためにロック状態を再配線します。

残念なことに、POSIXのpthreadインタフェースは絶望的に指定されておらず、その方法を提供していません。特に、実際に実行されているスレッドを把握できるように、あらゆる種類のリフレクションインターフェイスが欠けています。

とにかくこれをやりたければ、私はこれにアプローチしようとする2つの方法を見ることができます:

  • /proc/self/taskを突き止めて、プロセス内でどのスレッドが実行されているかを把握し、おそらく、内部状態を取得するために他のスレッドをptrace(2)する必要があります。これは非常に難しいでしょう。

  • pthreadsライブラリをラップする - ライブラリを直接使うのではなく、すべての呼び出しを傍受し、作成されるすべてのスレッド/ mutexes/locksを追跡して、フォークするときにその情報を利用できるようにする。これは、pthreadsを使用するサードパーティのライブラリを使用したくない限り、うまく動作します。

2番目のオプションははるかに簡単で(やや移植性がありますが)、アプリケーション全体のすべてのソースコードにアクセスできる場合にのみうまく動作し、ラッパーを適切に使用するように変更できます。

2
0
Kevin
27日 10月 2011 в 6:32
2011-10-27T18:32:16+00:00
さらに
ソース
編集
#56790237

周りにグーグルで行くと、私はソラリスがあなたが望むものとまったく同じforkall()呼び出しを持っていることを発見しました。

http://download.oracle.com /docs/cd/E19963-01/html/821-1601/gen-1.html

私はあなたがLinux上で動作していると仮定していますが、x86ハードウェア上でsolarisを実行することは可能です。だから多分それはあなたのためのオプションです。

0
0
質問の追加
カテゴリ
すべて
技術情報
文化・レクリエーション
生活・芸術
科学
プロフェッショナル
事業内容
ユーザー
すべて
新しい
人気
1
Roxana Elizabeth CASTILLO Avalos
登録済み 17時間前
2
Hideo Nakagawa
登録済み 1日前
3
Sergiy Tytarenko
登録済み 3日前
4
shoxrux azadov
登録済み 5日前
5
Koreets Koreytsev
登録済み 1週間前
© de-vraag :年
ソース
stackoverflow.com
ライセンス cc by-sa 3.0 帰属