回答編集履歴

3

update

2016/10/25 08:47

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -67,3 +67,13 @@
67
67
 
68
68
 
69
69
  シグナルハンドラと別スレッドの通信には、`volatile sig_atomic_t`型の変数を使うか、POSIXセマフォ([`sem_post`](http://pubs.opengroup.org/onlinepubs/009695399/functions/sem_post.html))しか通信の手段がありません。
70
+
71
+
72
+
73
+ ---
74
+
75
+ 非同期シグナルハンドラとPthreadマルチスレッド処理を組合せるのは、非常に高度なトピックですし、難解で間違えやすいプログラミングの代表格です。
76
+
77
+
78
+
79
+ 非同期シグナルハンドラを使うのではなく、`sigwait`関数による同期的なシグナル待機に書き換えられるのであれば、後者の方がマルチスレッドプログラミングとの親和性が高くなります。詳細は [シグナルハンドラを使わないでシグナルをハンドルする](http://d.hatena.ne.jp/yupo5656/20060114/p1) や [シグナルについて](http://d.hatena.ne.jp/kori_hatonosuke/20050502/1115019568) を参照ください。

2

update

2016/10/25 08:47

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -66,4 +66,4 @@
66
66
 
67
67
 
68
68
 
69
- シグナルハンドラと別スレッドの通信には、`volatile sig_atomic_t`型の変数しか通信の手段がありません。
69
+ シグナルハンドラと別スレッドの通信には、`volatile sig_atomic_t`型の変数を使うか、POSIXセマフォ([`sem_post`](http://pubs.opengroup.org/onlinepubs/009695399/functions/sem_post.html))しか通信の手段がありません。

1

update

2016/10/25 08:24

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -49,3 +49,21 @@
49
49
 
50
50
 
51
51
  [条件変数 Step-by-Step入門](http://yohhoy.hatenablog.jp/entry/2014/09/23/193617) の説明も参考に下さい。
52
+
53
+
54
+
55
+ ----
56
+
57
+ > 通知スレッドの部分をシグナルハンドラで実装する場合も同様にして実装すればよいでしょうか?
58
+
59
+
60
+
61
+ いいえ。Linux(POSIX)シグナルハンドラ内部で行える処理は、通常コードに比べると**大幅に制限**されます。基本的に、ほとんど全てのCライブラリ関数は**呼び出せない**と考えてください。JP-CERTの [シグナルハンドラ内では非同期安全な関数のみを呼び出す](https://www.jpcert.or.jp/sc-rules/c-sig30-c.html) も参照ください。
62
+
63
+
64
+
65
+ 厳格な話をすると、シグナルハンドラ本体では「`volatile sig_atomic_t`型の変数を書き換える」か「ごく一部の限られた関数(シグナルセーフ関数)を呼び出すこと」しか行ってはいけません。ミューテックスのロック操作や条件変数への通知操作はシグナルセーフではないため、何が起きても(期待通り動かなくても)文句を言えません。
66
+
67
+
68
+
69
+ シグナルハンドラと別スレッドの通信には、`volatile sig_atomic_t`型の変数しか通信の手段がありません。