gcc (GCC) 4.6.3 c89 valgrind-3.6.1
こんにちは、
更新されたコード スニペット +++++++++++++++++++++++++++++++++++
void *thread_recv_fd()
{
pthread_mutex_lock(&mutex_queue);
while(start_receiving) {
pthread_mutex_unlock(&mutex_queue);
pthread_mutex_lock(&mutex_queue);
queue_remove();
pthread_mutex_unlock(&mutex_queue);
usleep(500);
}
pthread_exit(NULL);
}
上記のロックを使用すると、非常に見苦しくなります。そして、..の読み取りでまだ競合エラーが発生しますstart_receiving
。また、揮発性としても宣言しました。+++++++++++++++++++++++++++++++++++++++
1/2 秒ごとにポーリングするワーカー スレッドで while ループを実行しています。ユーザーがctrl-cを入力すると、値がfalseに変更されるグローバル変数start_recomingで制御します。
このようなグローバルを持つことは良い習慣ですか?
helgrind を実行するとこれら 2 つのエラーが発生するので、私が尋ねた理由は次のとおりです。
==6814== Possible data race during write of size 4 at 0x601958 by thread #1
==6814== at 0x401131: main (driver.c:78)
==6814== This conflicts with a previous read of size 4 by thread #2
==6814== at 0x4012A7: thread_recv_fd (driver.c:127)
これはコード行です:
driver.c:78 is this line of code start_receiving = FALSE;
driver.c:127 is this line of code while(start_receiving) in the while loop
ソースコード、重要なスニペットのみ:
static int start_receiving = FALSE;
int main(void)
{
pthread_t thread_recv_id;
pthread_attr_t thread_attr;
/* Start polling as soon as thread has been created */
start_receiving = TRUE;
do {
/* Start thread that will send a message */
if(pthread_create(&thread_recv_id, &thread_attr, thread_recv_fd, NULL) == -1) {
fprintf(stderr, "Failed to create thread, reason [ %s ]",
strerror(errno));
break;
}
}
while(0);
/* Wait for ctrl-c */
pause();
/* Stop polling - exit while loop */
start_receiving = FALSE;
/* Clean up threading properties */
pthread_join(thread_recv_id, NULL);
pthread_exit(NULL);
}
void *thread_recv_fd()
{
while(start_receiving) {
pthread_mutex_lock(&mutex_queue);
queue_remove();
pthread_mutex_unlock(&mutex_queue);
usleep(500);
}
pthread_exit(NULL);
}
ご提案いただきありがとうございます。