
現在、下記のようなプログラムを作成しています。
内容は、メッセージキューを受信するスレッドを生成するというイメージです。
処理内容は下記のようになります。
(1)メッセージキューの生成
(2)スレッド生成(メッセージキュー受信側)
(3)スレッド停止
(4)メッセージキューの削除
しかし、(3)のスレッド停止を実施しても、(4)のメッセージキューの削除以降にて、msgrcvのエラーが出力されてしまいます。
スレッド停止を行ったことから、TestThreadは動作しなくなり、(4)のメッセージキューの削除にて、エラーともならずに終了することを望んでりますが、上手くいきません。
下記に作成しているプログラムを記載いたします。
正常終了をするには何がいけないのでしょうか?
ご教授宜しくお願い致します。
[test.cc]
----------------------------------------------------------------
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <ctype.h>
#include <stdlib.h>
#include <pthread.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// メソッドポインタ定義
typedef void (*testT);
// スレッドID
pthread_t threadId;
// メッセージキュー識別子
int msqId;
// 送受信するメッセージ
struct msgbuf{
long int type;
char data[BUFSIZ];
};
// テストスレッド
void TestThread()
{
// メッセージ
struct msgbuf message;
while( 1 )
{
printf("### TEST ###\n");
printf("msq start\n");
// 受信
if( msgrcv( msqId, &message, BUFSIZ, 0, 0 ) == -1)
{
printf("ERR! msgrcv errno[%d]\n", errno);
continue;
}
printf("msq ed\n");
sleep(1);
}
return;
}
// メイン
int main(int argc, char *argv[])
{
// メッセージキュー識別子退避変数
int testMsqid;
// スレッド操作リターン値
int status;
// スレッドa用のパラメータ
pthread_t thread_test;
printf("### TEST START ###\n");
// メッセージキューの作成
if( (testMsqid = msgget((key_t)1111, 0666 | IPC_CREAT)) == -1 )
{
printf("ERR! CREATE bkMsqId[%d]\n", testMsqid);
return 1;
}
// メッセージキュー識別子を共通変数に設定
msqId = testMsqid;
printf("msgget OK\n");
sleep(5);
// スレッドを生成
status = pthread_create(&thread_test, NULL, (void*(*)(void*))TestThread, (void*)NULL);
if(status!=0)
{
printf("pthread_create ng\n");
return 1;
}
printf("pthread_create OK\n");
sleep(5);
// スレッド停止
status = pthread_cancel(thread_test);
// スレッド停止結果
if ( status != 0 )
{
printf("pthread_cancel ng\n");
return 1;
}
printf("pthread_cancel OK\n");
sleep(5);
// メッセージキューの削除
if ( msgctl( msqId, IPC_RMID, NULL) == -1 )
{
printf("msqId[%d] errno[%d]\n", msqId, errno);
return 1;
}
printf("msgctl OK\n");
sleep(5);
printf("### TEST E N D ###\n");
return 0;
}
----------------------------------------------------------------
No.1ベストアンサー
- 回答日時:
1.スレッドのcanceltypeが
PTHREAD_CANCEL_DEFERRED(デフォルト値)
の場合、そのスレッドは次のcancellation pointまで止まりません。
2. IPCのmsgrcv()が 安全な cancellation point になるかどうかは怪しいです。(実装依存で結果不定が正解だと思います。)
対策としては、明示的に cancellation point
~pthread_testcancel()など~
を埋め込むのが確実でしょう。
ご教授ありがとうございます。
msgrcvはキャンセルポイントであると思っておりました。
明示的にキャンセルポイントを埋め込むと、可能であるのですね。
逆に、スレッドのcanceltypeが
PTHREAD_CANCEL_ASYNCHRONOUS
(取り消し要求が届くと直ちに呼び出しスレッドを取り消す)
であると、直ちに取り消すということになるのですよね?
2種類の方法があると思われますので、両方とも試してみたいと思います。
大変有り難う御座いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
strcmp
-
printfの出力内の文字をdefine...
-
printf で二進表示を行いたい。
-
*を使ったジグザグのラインをプ...
-
Cプログラムについて
-
C言語での数字の花形表示
-
defineで定数が置き換えられな...
-
10個出力で改行したいのですが...
-
%P と %X の違い
-
C言語に関して質問です。 次の...
-
コンパイルエラーについて
-
cshの文字列操作(0埋め)
-
int型 00 を表示するのに0とな...
-
【C言語教えてください】sin波...
-
学校の課題で
-
2から120以下の素数を求める
-
文字列のprint文
-
Cのdoubleの浮動小数点表示につ...
-
ヘロンの公式を作ったプルグラ...
-
エラーの意味が…
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンパイルエラーについて
-
printf で二進表示を行いたい。
-
10個出力で改行したいのですが...
-
テキストカーソル位置の取得
-
c言語でAからZまでを表示する...
-
strcmp
-
4の倍数を論理演算で表す。。
-
コマンドラインに出力した文字...
-
コマンドプロンプトがすぐ消える
-
(C言語)めちゃくちゃな値にな...
-
円の面積を求めるプログラミン...
-
【C言語教えてください】sin波...
-
C言語 プログラミング
-
unsigned int型について
-
入力したお金の金額からお札の...
-
WM_CLOSEで閉じれないウィンド...
-
c言語で2000年以降カレンダーを...
-
%P と %X の違い
-
switch分のケースを範囲数?に...
-
LU分解法のピボット選択機能実...
おすすめ情報