[過去ログ] マルチスレッドプログラミング相談室 その4 (1001レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
65
(6): 2005/11/20(日)17:29 AAS
セマフォをつかって、ある処理に関してロック、アンロックの処理が
したい場合、ソースは以下のようなかんじ問題ないですか?
※以下のプログラムを2つ同時に動かした場合、
セマフォの開放は1つ目のプロセスによって行われているので、
2つ目のプロセスはIPC_RMIDの際に、エラーが出てしまいますよね。
これって、基本的にはどうするといいんですかね?
66: 65 2005/11/20(日)17:29 AAS
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> 
#include <sys/sem.h>
union semun { int val;
struct semid_ds *buf; unsigned short int *array;
struct seminfo *__buf; };
int lock(int argc, char *argv[]) {
union semun semaphore_union;
struct sembuf semaphore_buffer;
int semaphore_id;
semaphore_id = semget((key_t)1000, 1, 0666 | IPC_CREAT);
省21
67: 65 2005/11/20(日)17:30 AAS
//sem end
if ( semctl(semaphore_id, 0, IPC_RMID, semaphore_union) != 0 ) {
exit(1);
}
 この際に、一つめのプロセスが既に削除しているので、
 2つ目のプロセスでは、エラーが帰ってきてしまいます。
 基本的にセマフォの扱いって、どう記述するものなんですか。
68
(1): 65 2005/11/20(日)17:31 AAS
正しいやり方かはわからないが。
@プロセス1の処理が終わったら、セマフォに「プロセス1終わったよ」書き込む。
A「プロセス1終わったよ」になるまで待機してから、
 「プロセス2も終わったよ」を書き込んでから、プロセス2を削除。
B「プロセス2も終わったよ」を確認してから、プロセス1を削除
69
(1): 65 2005/11/20(日)17:31 AAS
>>68
それぞれのプロセスをIPC_RMIDさせる直前までwait させろってことですよね。
  そのケースは、事前に立ち上がるプロセス数(たとえば、自分で
  fork して作成したプロセス)が分かっている場合、有効ですよね。
 
 何個のプロセスがあがるか分からないときの手段としては、
 IPC_RMID させる時は、手動で打つがいいのかな。
70
(1): 2005/11/20(日)17:35 AAS
>>65
ここはマルチ「スレッド」のスレだ。
決してマルチ「プロセス」のスレではない。
75
(1): 65 2005/11/21(月)00:29 AAS
AA省
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.046s