下記の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,¶m);
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,¶m);
error=pthread_attr_getschedpolicy(tattr,&policy);
if(error==0){
printf(" My Policy is %d\n",policy);
}
error=pthread_attr_getschedparam(tattr,¶m);
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;
}
以上宜しくお願いします。
回答1件
あなたの回答
tips
プレビュー