質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1443閲覧

C言語についてです(スレッド)

Cchan

総合スコア35

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/11/21 15:18

スレッドプログラムに関し質問です。
ミューテックスを使わず、スレッド二つでthread_entry関数を実行したいです。

thread_entry関数の for文の処理の部分で競合を意図的に起こし、最後stk.countを0以外の数にしたいのですが、何度実行しても0になってしまいます・・・

C

1 2#include <stdio.h> 3#include <stdlib.h> 4#include<pthread.h> 5 6struct stack { 7 int buf[128]; 8 int count; 9}; 10 11void stack_init(struct stack* stk) 12{ 13 stk->count = 0; 14} 15 16void stack_push(struct stack* stk, int val) 17{ 18 stk->buf[stk->count++] = val; 19} 20 21int stack_pop(struct stack* stk) 22{ 23 if (stk->count <= 0) { 24 fprintf(stderr, "ERROR: stack is empty\n"); 25 abort(); 26 } 27 28 return stk->buf[--stk->count]; 29} 30 31void* thread_entry(void* stk){ 32 33 for (int i=0; i < 1000000; i++){ 34 stack_push(&stk,i); 35 stack_pop(&stk); 36 37 } 38 return NULL; 39} 40 41 42int main(int argc, char* argv[]) 43{ 44 struct stack stk; 45 stack_init(&stk); 46 int er; 47 void* ret; 48 pthread_t tid1,tid2; 49 50 er = pthread_create(&tid1, NULL, thread_entry, (void *)&stk); 51 if (er != 0) goto error; 52 er = pthread_create(&tid2, NULL, thread_entry, (void *)&stk); 53 if (er != 0) goto error; 54 55 56 pthread_join(tid1, &ret); 57 pthread_join(tid2, &ret); 58 59 printf("%d",stk.count); 60 return 0; 61 62 error: 63 fprintf(stderr,"ERROR\n"); 64 return -1; 65 66 } 67

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

仮に、countの計算がずれるとしたらどういうことが起こったのか、ということを考えてみます

[thread1] tmp1 = count;
[thread2] tmp2 = count;
[thread1] count = tmp1 + 1;
[thread2] count = tmp2 + 1;

こうなれば、本来countは2でないといけないのに、countが1になるということが起こると思います。
では、stk->count++ って書き方で、上のような処理が期待できるか、といわれるとほとんど期待できないでしょう。

アセンブラだとこうなってるんじゃないかと思います
add [count], 1

要は1命令でいきなり足し算が終わってしまうので、上のような分割操作が行われません

ただ、bufの書き込む位置がおかしいという事は起きていると思います。

投稿2018/11/21 16:09

izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

どこでどう競合が起きるとそうなるのか、考えてみればいいかと。

投稿2018/11/21 23:27

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問