- ベストアンサー
pthread_attr_tへの値の代入について
スレッドを作成する際に、 属性としてPTHREAD_CREATE_DETACHEDを指定したいのですが、 その際pthread_attr_tをどのように設定したらよいかわかりません。 現在書いているコードは pthread pt; pthread_attr_t* attr; pthread_attr_init(attr); pthread_attr_setdetachstate(attr,PTHREAD_CREATE_DETACHED); if (pthread_create(&pt,attr,NULL,NULL) != 0){ perror("thread_create()"); exit(1); } 上記のようなものです。(スレッド作成部分のattr以外の 引数は適当です) これでコンパイルすると 警告: 変数 attr には値が代入されていません. と、警告が出てしまいます。 これを解消するにはどう修正したらよいのでしょうか?
- ponshige
- お礼率65% (34/52)
- C・C++・C#
- 回答数2
- ありがとう数3
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
以下のようにしてください。 --------------------------- pthread pt; pthread_attr_t attr; // *をとる pthread_attr_init(&attr); // &を付加 pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); // &を付加 if (pthread_create(&pt,&attr,NULL,NULL) != 0){ //&を付加 perror("thread_create()"); exit(1); }
その他の回答 (1)
- rinkun
- ベストアンサー率44% (706/1571)
とりあえず > pthread_attr_t* attr; > pthread_attr_init(attr); は < pthread_attr_t attr; < pthread_attr_init(&attr); ですね。後の行も対応するように変更します。 pthread_attr_initは引数で指定した領域に書込みしますので割当て済みの領域を渡さなければいけません。
お礼
ありがとうございます。 理由まで教えていただき、よくわかりました。 答えていただいたお二方に 20ptずつ入れたいところですが、、 タッチの差ということでrinkun様には 10pt入れさせていただきます。
関連するQ&A
- スレッドの作成について(pthread_create関数)
以下のプログラムをLinuxで実行するとpthread_create関数の戻り値が『1』となり、errno変数には『4』が入ってしまいます。(どちらにも『0』が入っててほしい) 何がやりたいのかというと、子スレッドのプライオリティを優先指定にして、子スレッドが生成されることを確認したいだけなのですが。。。 (下のプログラムじゃきっと本質的には確認できたことにはならないとおもいますが。。。) 何故pthread_create関数の戻り値が『1』となり、errno変数には『4』が入ってしまうかわかる方、どなたかご教授願えませんでしょうか? -------------------------------ここから------------------------------- #include <pthread.h> #include <errno.h> void *test2( void * ); int main ( int argc, char **argv ) { int iThCreateRes=0; pthread_attr_t t_attr; int bRet=0; pthread_t szThreadHandle; errno = 0; pthread_attr_init( &t_attr ); pthread_attr_setdetachstate( &t_attr, PTHREAD_CREATE_JOINABLE ); pthread_attr_setschedpolicy( &t_attr,SCHED_RR ); pthread_attr_setinheritsched( &t_attr, PTHREAD_EXPLICIT_SCHED ); pthread_attr_setscope( &t_attr, PTHREAD_SCOPE_PROCESS ); iThCreateRes = pthread_create( &szThreadHandle, &t_attr, test2, (void *)777 ); if( iThCreateRes == 0 ) { } return ( bRet ); } void *test2( void *iParam ) { return (void*)0; } -------------------------------ここまで-------------------------------
- ベストアンサー
- C・C++・C#
- pthread質問があります
devc++を使ってpthreadの勉強をしてます pthread-win32 packageをinstall して実行をしたのですがerrorがでます 何の理由か分かりません 教えてください [Linker error] undefined reference to `_imp__pthread_attr_init' [Linker error] undefined reference to `_imp__pthread_attr_getscope' [Linker error] undefined reference to `_imp__pthread_attr_setscope' [Linker error] undefined reference to `_imp__pthread_create' [Linker error] undefined reference to `_imp__pthread_join' [Linker error] undefined reference to `_imp__pthread_exit' ld returned 1 exit status #include <pthread.h> #include <stdio.h> #define NUM_THREADS 5 void *runner(void *param); int main(int argc, char *argv[]) { int i, scope; pthread_t tid[NUM_THREADS]; pthread_attr_t attr; //get the default attributes pthread_attr_init(&attr); //first inquire on the current scope if(pthread_attr_getscope(&attr,&scope) != 0) fprintf(stderr, "Unable to get scheduling scope\n"); else { if(scope == PTHREAD_SCOPE_PROCESS) printf("PTHREAD_SCOPE_PROCESS"); else if(scope == PTHREAD_SCOPE_SYSTEM) printf("PTHREAD_SCOPE_SYSTEM"); else fprintf(stderr, "Illegal scope value.\n"); } //set the scheduling algorithm to PCS or SCS pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); //create the threads for(i=0;i<NUM_THREADS;i++) pthread_create(&tid[i],&attr,runner,NULL); //now join on each thread for(i=0;i<NUM_THREADS;i++) pthread_join(tid[i],NULL); getchar(); getchar(); return 0; } //each thread will begin control in this function void *runner(void *param) { //do some work pthread_exit(0); }
- ベストアンサー
- C・C++・C#
- スレッドのスケジューリングポリシーと優先順位の設定(pthread)
こんにちは。今、マルチスレッドのプログラミングをする上で困っていることがあります。 pthread(スレッド)の優先順位をどのように変更するのかがわかりません。 また、メインの優先順位も変更したいのですがよくわかりません。 現在、↓のようにやっていますが、変更されていないような気がします。 間違っているようであればご指摘やアドバイスをいただけるとうれしいです。 宜しくお願いします。 ------------------------- int main(){ int policy; pthread_t th; pthread_attr_t th_att; struct sched_param scp; /* pthread の優先順位の変更 */ scp.sched_priority = 50; /* この値は適当です…*/ policy = SCHED_FIFO; pthread_attr_init(&th_att); pthread_attr_setschedpolicy(&th_att,policy,&scp) /* mainの優先順位の変更*/ scp.sched_priority = 30; /* この値は適当です…*/ pthread_setschedparam(pthread_self(),policy,&scp) pthread_create(&th,&th_att,(void*)func,NULL); . . .
- ベストアンサー
- C・C++・C#
- pthread_detach
先日、C,C++カテゴリで質問していたのですが回答がつきませんでしたので、こちらで質問させていただきます。 pthread_create()してpthread_detachしているとします。 pthread_create()する前にmallocで領域確保した変数を引数として生成スレッドに渡しているとすると、detachした時点でmallocで確保した領域はfree()されるのでしょうか? それともメモリリークとなりますか?
- ベストアンサー
- その他(OS)
- pthread_cond_wait 取りこぼし?
はじめまして。 pthreadのお勉強がてら、パイプライン処理を実装してみようととりあえず実証コードを書いてみましたが、うまく意図した動きをしてくれません。 やりたいことは、処理ステージが2つあって、メインからステージ1をキックし、ステージ1は自分の処理が終わったらステージ2をキックするといった動作です。(メイン、ステージ1、ステージ2を並列に動作させたい) 取りあえず連鎖的に動作するか試したいだけなので、ステージ間のデータの受け渡しとかは、後で考えるとします。 それで、以下のような単純なコードを書きました。 期待する結果は、最後に表示される数値が 10000, 10000, 10000 になることですが、実際は、10000, 4401, 4401 のようにステージ1,2が少なくなります。 一応、それなりに調べて条件変数のセオリーに従い書いたつもりなのですが、どうしてこうなるか、ご教授ください。 test.c (空白を全角にしてあります) ------ #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string.h> pthread_mutex_t mutex1, mutex2; pthread_cond_t cond1, cond2; int ready1, ready2; int end1, end2; int count1, count2; void * stage1( void *arg ) { pthread_mutex_lock( &mutex1 ); while( 1 ) { /* wait for my signal & job */ while ( ready1 == 0 ) { pthread_cond_wait( &cond1, &mutex1 ); } if ( end1 == 1 ){ /* is shutdown thread */ break; } /* my job. */ count1++; /* job clear */ ready1 = 0; /* forward next stage */ pthread_mutex_lock( &mutex2 ); ready2 = 1; pthread_cond_signal( &cond2 ); pthread_mutex_unlock( &mutex2 ); } pthread_mutex_unlock( &mutex1 ); return NULL; } void * stage2( void *arg ) { pthread_mutex_lock( &mutex2 ); while( 1 ) { while ( ready2 == 0 ) { pthread_cond_wait( &cond2, &mutex2 ); } if ( end2 == 1 ){ break; } count2++; ready2 = 0; } pthread_mutex_unlock( &mutex2 ); return NULL; } int main( ) { int i; pthread_t t1, t2; pthread_mutex_init( &mutex1, 0 ); pthread_cond_init ( &cond1, 0 ); ready1 = 0; end1 = 0; count1 = 0; pthread_create( &t1, 0, stage1, NULL ); pthread_mutex_init( &mutex2, 0 ); pthread_cond_init ( &cond2, 0 ); ready2 = 0; end2 = 0; count2 = 0; pthread_create( &t2, 0, stage2, NULL ); for ( i=0; i<10000; i++ ){ pthread_mutex_lock( &mutex1 ); ready1 = 1; pthread_cond_signal( &cond1 ); pthread_mutex_unlock( &mutex1 ); } pthread_mutex_lock( &mutex1 ); ready1 = 1; end1 = 1; pthread_cond_signal( &cond1 ); pthread_mutex_unlock( &mutex1 ); pthread_join(t1, 0 ); pthread_cond_destroy( &cond1 ); pthread_mutex_destroy( &mutex1 ); pthread_mutex_lock( &mutex2 ); ready2 = 1; end2 = 1; pthread_cond_signal( &cond2 ); pthread_mutex_unlock( &mutex2 ); pthread_join(t2, 0 ); pthread_cond_destroy( &cond2 ); pthread_mutex_destroy( &mutex2 ); printf("%d, %d, %d\n", i, count1, count2); return 0; } ------ gcc -o test -lpthread test.c 以上
- ベストアンサー
- C・C++・C#
- クラス内でのpthread_createに関して
C言語初心者です。 下記のようなソースにて、クラス内でのスレッドを行うことが目的です。 しかし、下記のpthread_createにてコンパイルエラーとなります。 キャストエラーのようなのですが、キャスト方法がわかりません。 初歩的な質問で、大変申し訳御座いませんが、ご教授頂けませんでしょうか? ################################################################ #include <stdio.h> #include <pthread.h> // Testクラス class Test{ private: // スレッド処理 void testThread() { printf("### THREAD START ###\n"); return; } public: // スレッド開始 void threadStart() { // スレッド生成戻り値 int status; // スレッド pthread_t thread; // スレッド生成 status = pthread_create( &thread, NULL, (void*(*)(void*))testThread, NULL ); // スレッド生成結果 if ( status != 0 ) { printf("ERR!! pthread_create NG\n"); } return; } }; // メイン実行 int main(int argc, char *argv[]) { // Testクラスオブジェクト Test test; printf("### TEST START ###\n"); test.threadStart(); printf("### TEST E N D ###\n"); return 0; } ################################################################ 宜しくお願い致します。 以上です。
- 締切済み
- C・C++・C#
- pthread_createでタスクの構造体にて
pthread_createという関数でeventというスレッドタスクを作成したく、次のように宣言しました。 if(pthread_create(&thread03 , NULL , thread_func03 ,(void*)&pth) !=0) perror("pthread_create()"); ちなみに、pth_argは次のような構造です。 typedef struct{ char *c; int i; long l; }pth_arg; /* thread_func関数に値を渡すときの構造体 */ 実際のタスク void *event(void *param) { pth_arg *this_arg; this_arg = param; -----(中略)------------------------- } このような形ビルドも正常に完了し、this_argの構造をそのままこのタスク内で使用することも可能なのですが、その後に typedef struct{ char *c; int i; long l; }env_t; /* 次のような構造体もこのタスク内に追加したくなり、 実際のタスク env_t * pEnv; //グローバル宣言 void *event(void *param) { pth_arg *this_arg; this_arg = param; pEnv->i = 0x01; -----(中略)------------------------- } このように、env_t * pEnv;でグローバル宣言で宣言して 値を代入するようなコードを書くと、ビルドはOKなのですが、実行すると Segmentation fault (core dumped) このエラーが出てきて動作が停止してしまいます。 これを解決方法などありませんでしょうか? どうぞ、ご教示頂きますようお願い致します。
- ベストアンサー
- C・C++・C#
- pthread_mutex_unlock失敗?
pthreadプログラムで、mutex_lockするスレッドとmutex_unlockするスレッドが別スレッドとなっている場合、mutex_unlockが失敗することはあるでしょうか。mutexの初期設定(mutex_init)時、スレッドの属性は特に指定していません。 OSはHP-UXでCでコードを記述しています。 単発のプログラムで動作確認をした限りでは無事にunlockされているようでした。 (lockスレッドとunlockスレッドが別ということ自体が少し危険なことだとは思うのですが・・・)
- 締切済み
- その他(プログラミング・開発)
- 別ターミナルへのprintf出力
LinuxでC言語プログラムから新しいターミナルを開き、そこにprintfで文字を出力したいのですがどうやったら良いのでしょうか?下記プログラムを作ってみましたが、新しいターミナルが開くだけで文字が出力されません #include <pthread.h> #include <stdio.h> #include <unistd.h> #include <signal.h> void* thread(void* arg) { int pid=0; pid = fork(); if(pid==0) { execlp("gnome-terminal","gnome-terminal",NULL); printf("Hello World!!\n"); } } int main() { pthread_t th; void* result; pthread_create(&th, NULL,thread, NULL); pthread_join( th,&result); }
- ベストアンサー
- Linux系OS
- スレッドを2つ作って1秒ごとに2つのスレッドが数値を表示するプログラム
スレッドを2つ作って1秒ごとに2つのスレッドが数値を表示するプログラムを作りたいのですがうまくいきません。 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<sys/socket.h> #include<arpa/inet.h> #include<unistd.h> #include<pthread.h> void *threadMain(void *threadArgs); int main(void) { int i = 0; pthread_t threadID; for(i = 0;i < 2;i++){ pthread_create(&threadID,NULL,threadMain,(void *)NULL); } } void *threadMain(void *threadArgs) { int i = 0; while(1){ printf("%d\n",++i); sleep(1); } } 上記プログラムを実行すると1が2回表示されて終了してしまいます。 どこか間違えがあるのでしょうか。。
- ベストアンサー
- C・C++・C#
お礼
ありがとうございます。 無事解決しました。