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

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

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

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

VMware

VMwareとは、 ハードウェアで動作するOS上で仮想マシンを作成、実行するソフトウェアです。 Windows上でUNIX系OSを動作させたり、他のOS上で別の仮想OSを動作することが可能です。

受付中

WorkerThreadが2個目以降のキューを実行しません。

削除済ユーザー
削除済ユーザー

総合スコア0

C

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

VMware

VMwareとは、 ハードウェアで動作するOS上で仮想マシンを作成、実行するソフトウェアです。 Windows上でUNIX系OSを動作させたり、他のOS上で別の仮想OSを動作することが可能です。

3回答

0評価

0クリップ

2411閲覧

投稿2017/06/09 01:41

WorkerThreadを用いたプログラムを作成しております。

概要

  • リストコマンドラインに入力された数字によって動作を変更し、

サブスレッドで入力され次第随時実行していきます。

  • キューには連結リストを使用しています。

環境
VMware 7.1.4 build-3848939
Unbuntu Linux

C言語

#define _CRT_SECURE_NO_WARNINGS #include "stdlib.h" #include "stdio.h" #include "pthread.h" #include "CheckFile.h" #include "Integration.h" #include "Analysis.h" #include "AddList.h" #include "freeListPointer.h" #include "define.h" typedef struct Queue { int action; struct Queue *next; struct Queue *prev; }Queue; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t MainCond; pthread_mutex_t EventMutex; void *SubThread(void *p_arg); //Global Variable for End SubThread. int SubThreadEnd = 0; //Global Variable for count queue number. int count = 0; //Global Pointer Valiable for keep head pointer of queue. Queue *head = NULL; //Global Variable for end programs. int EndCount = 0; Queue *Enqueue(int action, Queue *p) { pthread_mutex_lock(&EventMutex); Queue *ptr = (Queue *)malloc(sizeof(Queue)); if(NULL == ptr) { printf("Could not get memory area.\n"); } if(p == NULL) { head = ptr; ptr->action = action; ptr->prev = NULL; ptr->next = NULL; pthread_mutex_unlock(&EventMutex); return ptr; } ptr->action = action; p->next = ptr; ptr->prev = p; ptr->next = NULL; count++; pthread_mutex_unlock(&EventMutex); return ptr; } void Action(int action) { if(action == 1) { } if(action == 2) { } if(action == 3) { } //処理は省きます。 void *SubThread(void *p_arg) { int loop = 0; printf("SubThread - Starting.\n"); while(1) { while(NULL != head) { pthread_mutex_lock(&EventMutex); //Dequeue by excuting the function. Action(head->action); head = head->next; pthread_mutex_unlock(&EventMutex); pthread_cond_signal(&MainCond); } } } void main() { pthread_t th; int action = 0; Queue *p = NULL; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_create(&th,NULL,SubThread,NULL); pthread_cond_init(&MainCond, NULL); pthread_mutex_init(&mutex, NULL); while(1) { printf("Select the action.\n"); printf("(1).Loading file.\n"); printf("(2).Select analysis method.\n"); printf("(3).Exit programs.\n"); scanf("%d",&action); p = Enqueue(action,p); pthread_cond_wait(&MainCond,&mutex); if(EndCount != 0) { break; } } printf("Exit program.\n"); }

実行後、1回目の入力では、正常にサブスレッドが機能していることが確認されたのですが、
2回目以降、main関数でコマンドラインより入力を行うとEnqueueを実行し終わったところで
プログラムがとまってしまいます。(エラーなどによる動作停止ではなく、メインでwaitして
いるのにサブスレッドが動きません。)

なぜサブスレッドは無限ループにしているにもかかわらずとまってしまっているのでしょうか。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

VMware

VMwareとは、 ハードウェアで動作するOS上で仮想マシンを作成、実行するソフトウェアです。 Windows上でUNIX系OSを動作させたり、他のOS上で別の仮想OSを動作することが可能です。