• ベストアンサー

スレッド?

kaz-sugiの回答

  • kaz-sugi
  • ベストアンサー率50% (3/6)
回答No.1

質問のタイトルからすると、マルチスレッドしたいのでしょうか・・・。 Linuxと仮定しますと、、 (下記のソースは概要であり、このまま動作しません) #include <pthread.h> #define NTHREADS 10 /* 適当 */ #define NARGS 5 /* 適当 */ pthread_t thread[NTHREADS]; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int data = 5; /* 適当 */ xxx() { int i; int arg[NARGS]; int yyy(); for (i = 0; i < NTHREADS; i++) { arg[0] = i; /* 適当 */ pthread_create(&thread[i], NULL, yyy, (void*)arg); } } yyy(void *arg) { int x; x = ((int *)arg)[0]; pthread_mutex_lock(&mutex); data++; pthread_mutex_unlock(&mutex); printf("%d) %d\n", x, data); } Linuxでは、スレッドの変わりにクローンプロセスというのができあがり、 見かけ上は、プロセス内に複数のスレッドができたのと同じように振舞わせるように、 pthreadライブラリがあり、それを上記のように使うと楽です。 スレッド(クローンプロセス)間では、スタック(ローカル変数)以外の、 データ(グローバル変数)は、共有されています。 (cloneシステムコールを使うと、もっと詳細に共有部分を設定できます) 共有しているデータへのアクセスの際に、 スレッド(クローンプロセス)間での同期をとるために、 pthread_mutex_lock/unlock を使用します。 上の例では、関数yyy()がマルチスレッド(クローンプロセス)により 実行されます。 ちなみに、 親子関係でないプロセス間で、本当の意味で共有メモリをするのであれば、 shmget/mat以外には、mmapというシステムコールがあります。

zukka
質問者

お礼

ありがとうございました。大変参考になりました。 もう一つ質問ですが、cloneの使い方で呼ぶ関数は、内部関数のみなのですか? 実行ファイル等呼べるのであれば、使い方を教えて下さい。 cloneを使った場合にもpthread_mutex_lock等は使用可能ですか?

関連するQ&A

  • windowsでのプログラミングについてなんですけど。

    UNIXの本を読んでると、プログラムはexitシステムコールが呼ばれると、 freeregを呼び出し、malloc済みメモリをすべて開放し、共有メモリについても 参照が0になったら解放するようになっていて、仮にメモリリークする プログラムで会ってもプロセスを殺せば、そのプログラムのリークした分は すべて解放されるんですよ~~~それと同じ感覚で、windowsでプログラム やってる友達に聞いたら、プロセスを殺してもnewでリークしたのしっぱなしに なるっぽいよ~って言ってたんですよ。それって本当なんですか? てか本当ならあえてそうしてるメリットってあるんでしょうか?

  • スレッドの意味

    マルチスレッドについて良い資料が見当たらず、教えて下さい。 OSにおけるマルチスレッドと言うと、同一プロセス内でメモリ空間を 共有して独立に動く一連の手続き、と捉えています。(シングルCPU シングルコアだとOSで時分割によって作られた仮想的な並列計算) Javaのようなマルチスレッドのプログラミング言語では「一つの プログラムから作られた二つの一連の手続き」と言うイメージが あります。※裏側の動作ではOSに依頼してJavaのプロセス内で OSのスレッドを生成して処理を渡しているだけ?と思っています。 CPUコアの内部で説明される「マルチスレッド」と言うのは、 どのようなレベルのスレッド(何が並列処理?何処まで並列?) なのでしょうか。

  • Linuxでのスレッド間メッセージについて

    Linuxでスレッドを複数生成し、スレッド間でメッセージのやり取りをしたいと思っています。 ネットで色々検索したのですが、欲しい情報にめぐり合えていません。 # WindowsのPostThreadMessage()みたいなものを探しています。 #「プロセス間通信」というものは発見しましたが・・・ 何か方法はありますでしょうか? スレッド間のメッセージのやり取りの方法がない場合は代替案も教えて頂きたいです。 # セマフォを用いて共有メモリアクセスかな?と思っています。

  • パフォーマンスモニタのメモリについて

    1.パフォーマンスモニタであるPrivate Bytes、Working Setがいまいち理解できませんが、下記の認識であっておりますでしょうか。 (1) 仮想メモリ 物理メモリが不足したときに使用するハードディスク上に設定した仮想メモリ(ページングファイル) (2) Private Bytes : ほかのプロセスから共有されない仮想メモリサイズ (3) Working Set : プロセスが使用している物理メモリサイズ 2.認識があっている場合、Working Setは、他のプロセスと共有されていますでしょうか。 Working Setがほかのプロセス共有されていないとのことでしたら、Private Bytesと Working Setを足した値がそのプロセスが使用しているメモリの合計ということでしょうか。

  • 二重起動チェックについて

    Solarisで、プロセスの二重起動チェックを行いたい のですが、システムコールの使用など簡単に行える 方法はないでしょうか? よろしくお願い致します。

  • 実行中のプロセスのシステムコールフックについて

    表題の通り,実行中のプロセスのシステムコールのフックについて質問があります. 現在,Linux上の全てのプロセスがどんなシステムコールを使って,どんなリソースにアクセスをしているのか調査しているのですが 具体的には以下のURLのソフトと同じものを,Linux上でC言語を用いて作りたいと考えています. [Process Monitor] http://www.microsoft.com/technet/sysinternals/utilities/processmonitor.mspx いろいろ調べていく中で strace http://www.netadmintools.com/html/1strace.man.html を使うと目的としている調査が実装できそうだということでさっそくいじってみたのですが, strace では既に実行されているプロセスのシステムコールの呼び出しをトレースすることはできないようでした. そこで1点質問なのですが,既に実行中のプロセスのシステムコールをフックするにはどのような方法を使えばいいのでしょうか. お分かりになるかたご回答よろしくお願いします. こちらの開発環境は以下です. OS: Debian 4.0 Kernel: 2.6.20-16 gcc: 4.1.2 (3つとも11/9現在の最新版を使用しています)

  • 共有メモリの同時アクセスについて教えてください。

    2つのプロセスが同時に同じ共有メモリにアクセスすることは可能ですか? ミューテックスや、セマフォなどの排他制御を外せばできたりしませんか? 片方のプロセスで共有メモリから、データの一部をHDDに保存しつつ、それと同時に、もう片方のプロセスで共有メモリからデータの中身を表示させたいのですが・・・。

  • CPU使用率が100%になってしまいます

    ファンの稼動が激しいため、タスクマネージャをみたところ、CPU使用率が100%のまま変わりません。プロセスのiexpore.exeが90~99でメモリ使用量が36104Kになっています。普段は、たしか、System Idle Processが90~99なはずなのですが、このようにCPU使用率が100%の時は、System Idle ProcessのCPUが0で、メモリ使用量は、16Kになってます。CPU使用率を下げる方法はありますでしょうか?

  • 32ビットCPUのメモリについて

    32ビットCPUの場合、アドレス空間の制限で1プロセスにつき4GBまでしか使用できないことになっていると思いますが、このうち2GBはシステム用、その他2GBがアプリケーション用と聞いたことがあります。1プロセスで使用する度にOSに2GBほどのメモリを使用することがあるのでしょうか?(プロセスが多くなる度にOSで使用されるメモリ量も増大すると考えてよろしいでしょうか?)

  • Windowsのメモリ使用量が稼働プロセスと不一致

    Windows で使用しているメモリ量をプロセスごとに把握する際に、 検算としてリソースモニタのメモリタブに表示されるプロセスのメモリ量を合計してみましたが、 その容量がリソースモニタで表示されている物理メモリの使用サイズと一致しません。 ■使用マシン  OS : Windows Server 2008 R2 Enterprise 64bit  物理メモリ容量 : 16 GB ■リソースモニタでの出力内容  物理メモリ使用量 : 11241 MB  リソースモニタに表示されるプロセスの全メモリ合計(ワーキングセット) : 8306 MB  リソースモニタに表示されるプロセスの全メモリ合計(コミット) : 9509 MB タスクマネージャや tasklist コマンドで表示されるプロセスのメモリを合計しても、 同様に「物理メモリ使用量」の値に届かないため、プロセス外の何らかのものが メモリを使用していると推測されますが、実際はどうなのでしょうか? (共有メモリなど特定のプロセスに属さないメモリ領域など??) また、そういうものがあった場合、そのメモリ使用量をどのように確認すればよいでしょうか?