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

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

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

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

Q&A

解決済

2回答

2248閲覧

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

Cchan

総合スコア35

C

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

0グッド

0クリップ

投稿2018/11/22 02:18

スレッドについてなのですが、以下のコードでsegmentation faultが起きてしまいます・・
ミューテックスがうまくいってないのでしょうか?

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}; 10pthread_mutex_t mtx; 11 12void stack_init(struct stack* stk) 13{ 14 stk->count = 0; 15} 16 17void stack_push(struct stack* stk, int val) 18{ 19 stk->buf[stk->count++] = val; 20} 21 22int stack_pop(struct stack* stk) 23{ 24 if (stk->count <= 0) { 25 fprintf(stderr, "ERROR: stack is empty\n"); 26 abort(); 27 } 28 29 return stk->buf[--stk->count]; 30} 31 32void* thread_entry(void* stk){ 33 pthread_mutex_lock(&mtx); 34 for (int i=0; i < 2; i++){ 35 36 stack_push(stk,i); 37 stack_pop(stk); 38 39 } 40 pthread_mutex_unlock(&mtx); 41 return NULL; 42 43} 44 45 46int main(int argc, char* argv[]) 47{ 48 struct stack stk; 49 stack_init(&stk); 50 int er,i; 51 void* ret; 52 pthread_t tid[1]; 53 54 55 er = pthread_mutex_init(&mtx,NULL); 56 if (er != 0) goto error; 57 58 for(i=0;i<2;i++){ 59 er = pthread_create(&tid[i], NULL, thread_entry, (void *)&stk); 60 if (er != 0) goto error; 61 } 62 63 for(i=0;i<2;i++){ 64 pthread_join(tid[i], &ret); 65 } 66 67 68 69 return 0; 70 71 error: 72 fprintf(stderr,"ERROR\n"); 73 return -1; 74 75 }

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

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

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

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

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

nob.

2018/11/22 02:37

OS 処理系のバージョンなど、環境を書いてください。 私の環境(Ubuntu16.04.10, gcc 5.4.0)では faultしません。
Cchan

2018/11/22 02:59 編集

windows for ubuntu (bash)になります gcc 5.5.0
guest

回答2

0

ベストアンサー

mainの中の
pthread_t tid[1];

pthread_t tid[2];
に変えてください。
それでとりあえず、Segmentation faultは解決します。

投稿2018/11/22 03:50

tatsu99

総合スコア5438

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

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

Cchan

2018/11/22 06:10

ありがとうございます!
guest

0

直接の回答ではありません。ちょっと見ですが・・・

void* thread_entry(void* stk){ pthread_mutex_lock(&mtx); for (int i=0; i < 2; i++){ stack_push(stk,i); stack_pop(stk); } pthread_mutex_unlock(&mtx); return NULL; }

ですが、pushとpopを一緒にロックしてしまうのはおかしいかと?・・・これでは、同一スレッドのpush,popの動作が連続して起こってしまうので、複数のスレッドを使う意味が無いような・・・
・・・通常は、その操作(実際にpushあるいはpopする動作:stk->buf[stk->count++] = val;とか)にのみロックを掛けます。

投稿2018/11/22 02:38

cateye

総合スコア6851

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

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

cateye

2018/11/22 04:22 編集

通常、情報を入れるスレッドと取り出すスレッドは別物です。そのため上記のような書き方になりましたが、違う意図であればご容赦下さい。ちなみに、当方の環境(Linux-mint+clang8.0)ではtatsu99さんの指摘を修正した状態でエラーにはなっていません。$?=0
Cchan

2018/11/22 06:10

有難うございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問