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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

418閲覧

C++のスレッドのテストプログラム

nqf27650

総合スコア115

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/08/22 02:14

下記のC++のコードはスレッドのテストプログラムです。

スレッドFunAの生成回数を指定する、int NSTOP=2;の値を2以上に設定しますと、
正常に機能しますが、その値を1、即ち1回だけ生成する様に設定しますと、
スレッドが生成されません。

Q1) この件に付きましてコメント頂けますと大変有りがたいです。

添付コード:
..#include <pthread.h>
..#include <stdio.h>
..#include <stdlib.h>
..#include <unistd.h>
..#include <errno.h>
..#include <string.h>
..#include <time.h>
..#include <math.h>

void *FuncA(void *arg);

int main(){

pthread_attr_t *tattr;

tattr=(pthread_attr_t *)malloc(sizeof(pthread_attr_t));

pthread_t tid[5];
struct sched_param param;
int pr,error,i;
int NSTOP=2; //<ーーこの値です
//int policy=SCHED_OTHER;//0
int policy=SCHED_FIFO;//1
//int policy=SCHED_RR;//2
//int policy=SCHED_IDLE;//xxx
//int policy=SCHED_BATCH;//xxx

if(error=pthread_attr_init(tattr)){
printf("Attribute initialization failed with error %s\n",strerror(error));
//warning: implicit declaration of function ‘strerror’ [-Wimplicit-function-declaration]
}
//pthread_attr_setschedpolicy
error = pthread_attr_setschedpolicy(tattr, policy);
if (error != 0) printf("failed to set policy\n");
for(i=0;i<NSTOP;i++){
scanf("%d",&pr);

param.sched_priority=pr;
error=pthread_attr_setschedparam(tattr,&param);

if(error!=0){
printf("failed to set priority\n");
}

if(i%2==0){
if(error=pthread_attr_setdetachstate(tattr,PTHREAD_CREATE_DETACHED)){
fprintf(stderr,"Failed to set thread attributes with error %s\n",strerror(error));
}
}
else if(error=pthread_attr_setdetachstate(tattr,PTHREAD_CREATE_JOINABLE)){
fprintf(stderr,"Failed to set thread attributes with error %s\n",strerror(error));
}

pthread_create(&tid[i],tattr,FuncA,tattr);
//usleep(100000);
pthread_join(tid[i],NULL);

printf("pthread_join was done i=%d\n",i);
}

free(tattr);

printf("All threads terminated\n");
return 0;
}

void *FuncA(void *arg){
printf("FunA is running\n");
pthread_attr_t *tattr=(pthread_attr_t *)arg;
int state,error;

int policy;
struct sched_param param;
//display_thread_sched_attr("=====get plicy and priority===");

error=pthread_attr_getdetachstate(tattr,&state);

if(error==0 && state==PTHREAD_CREATE_DETACHED){
printf(" My state is DETACHED\n");
}
else if(error==0 && state==PTHREAD_CREATE_JOINABLE){
printf(" My state is JOINABLE\n");
}

//error=pthread_attr_getschedpolicy(tattr,&param);
error=pthread_attr_getschedpolicy(tattr,&policy);
if(error==0){
printf(" My Policy is %d\n",policy);
}

error=pthread_attr_getschedparam(tattr,&param);

if(error==0){
printf(" My Priority is %d\n",param.sched_priority);
}

//=============
clock_t c1,c2;
c1 = clock();
//=============
double dwk;
for(int i=0; i<10000000; i++){
dwk=sin((double)i);
}
//=================
c2 = clock();
printf("time = %f[s]\n", (double)(c2-c1)/CLOCKS_PER_SEC);
//=================
fflush(stdout);

printf("FunA is finished\n");

return NULL;
}
以上宜しくお願いします。

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

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

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

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

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

mattn

2017/08/22 02:15

読めないのでコードブロックを使って下さい。コードの前と後ろの行に ``` を入れて下さい。(質問する側のエチケットです)
guest

回答1

0

ベストアンサー

ループ回数が偶数の時はPTHREAD_CREATE_DETACHEDでスレッド生成しているので、後続のpthread_joinではスレッドの終了を待つことができません。
なので、スレッドは作られているが待つことができないので、スレッドが実行される前にmainが終了してしまっているのではないでしょうか。

投稿2017/08/22 02:51

ttyp03

総合スコア16998

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問