• ベストアンサー

pthread_self APIの高速化

HP-UX上でCを使ってスレッドプログラムを書いています。 プログラム内部でスレッドIDを変数に保持して、その変数を元に、pthread_detachなどのAPIをコールするような作りになっているのですが、pthread_self APIで毎回、自スレッドIDを取得するようにすると、処理スピードは遅くなるのでしょうか。(どれくらい?気にするほど?) 感覚的には遅くなりそうな気がしてはいますが、プログラム変数の場合だと、予期しない変数の書き換えが発生した場合(これはこれでバグですので対応が必要になりますが・・・)などに余計な影響を受けることになり、どっちが得策なのか考えあぐんでいます。

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

pthread_selfを呼ぶよりは変数アクセス一つで済むほうが間違いなく速いですが、実際にどれくらい効果があるかは1つのスレッドがpthread_selfをどれほどの頻度で何回呼ぶ作りになっているか次第です。 ひたすらpthread_selfを呼び続けるプログラムでもなければ、体感できるほどの差はなかなか出ないと思います。

nishimry
質問者

お礼

回答ありがとうございました。 プログラム作成時、恐らく、特に理由も無くプログラム変数を使用したものと思われますが、やはり体感するまではいかないですよね。(CPU時間としては、確実に消費しているでしょうが。) 処理自体は散発的(とはいっても、タイミングによっては秒間数から十数回の呼び出しが必要)ですので、どっちがいいのかなかなか難しいところではあります。

関連するQ&A

  • pthread_detach

    先日、C,C++カテゴリで質問していたのですが回答がつきませんでしたので、こちらで質問させていただきます。 pthread_create()してpthread_detachしているとします。 pthread_create()する前にmallocで領域確保した変数を引数として生成スレッドに渡しているとすると、detachした時点でmallocで確保した領域はfree()されるのでしょうか? それともメモリリークとなりますか?

  • pthread_mutex_lock の応答時間

    HP-UX上でCを使ってpthreadプログラムを記述しています。 mutexを競合するスレッドが2つあり、  A) pthread_mutex_lock(&mutex)  B) pthread_mutex_lock(&mutex)  A) pthread_mutex_unlock(&mutex) の流れで処理が流れています。 この時、A)がlockを解放してからB)がlockを獲得できるまで(=pthread_mutex_lockの応答が返ってくるまで)に多少の時間がかかってしまうことはありうるのでしょうか。(現在発生している事象では、0.002秒程度) マシン性能にも拠ると思いますし、B)スレッドが再開するときのCPU割り当てに時間がかかった等も考えられるのかとは思いますが、スレッドライブラリとしての動きが知りたいです。

  • pthread_mutex_unlock失敗?

    pthreadプログラムで、mutex_lockするスレッドとmutex_unlockするスレッドが別スレッドとなっている場合、mutex_unlockが失敗することはあるでしょうか。mutexの初期設定(mutex_init)時、スレッドの属性は特に指定していません。 OSはHP-UXでCでコードを記述しています。 単発のプログラムで動作確認をした限りでは無事にunlockされているようでした。 (lockスレッドとunlockスレッドが別ということ自体が少し危険なことだとは思うのですが・・・)

  • スレッドの作成について(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; } -------------------------------ここまで-------------------------------

  • マルチコア上のLinux環境にて、スレッドを任意のコアに割り当てることは可能か?

    こんにちは。cstepと申します。 Intel Core 2 Quad(コア数x4)のマシン上の ReaHat Linux 9(Kernel 2.4.20-8)環境で、pthread(glibc-2.3.2-11.9, NPTL 0.29, gcc 3.2.2)を使用したマルチスレッド・プログラミングをしています。 各スレッドのコア割り当てを(OSの自動スケジューリングではなくて)手動で固定的に割り当てることは可能でしょうか? 可能な場合それを実現するAPIや実現方法をご教授いただけますでしょうか。 例えば、8つのスレッドからなるプログラムだとした場合、 ・スレッド1と5 → コア1に割り当て ・スレッド2と6 → コア2に割り当て ・スレッド3と7 → コア3に割り当て ・スレッド4と8 → コア4に割り当て というふうに、各スレッド(1~8)を任意のコア(1~4)に固定的に割り当てて動作させたいと考えております。 Windowsの場合は、SetThreadAffinityMask() または SetThreadIdealProcessor() といったAPIを使うことで上記の要求は可能かと思いますが、Linuxでの方法が分からず、質問させていただきました。 よろしくお願い致します。

  • VBAで後半部分のバグフィックス

    VBAで作成した長いプログラムがあり、 前半は完成しているのですが、後半が未完成で作りかけのものがあります。 しかも変数・配列が多量に使用されています。 後半の部分のプログラムを動かすためには 前半の計算を行う必要があるのですが、 後半の計算のバグを直すために何度もやり直すのに時間がかかってしまいます。 前半の計算で行った変数の代入を保持したままでVBAの計算を終了し、 後半の計算の手前から計算を行うようなことをしたいのですが このようなことは可能でしょうか? もし、無理だとして、このような長いプログラムで、しかも変数が多いような 場合どうやって一部(特に後半部分)のプログラムのバグフィックスを行えば良いでしょうか?

  • スレッドとメッセージキューに関して

    現在、下記のようなプログラムを作成しています。 内容は、メッセージキューを受信するスレッドを生成するというイメージです。 処理内容は下記のようになります。  (1)メッセージキューの生成  (2)スレッド生成(メッセージキュー受信側)  (3)スレッド停止  (4)メッセージキューの削除 しかし、(3)のスレッド停止を実施しても、(4)のメッセージキューの削除以降にて、msgrcvのエラーが出力されてしまいます。 スレッド停止を行ったことから、TestThreadは動作しなくなり、(4)のメッセージキューの削除にて、エラーともならずに終了することを望んでりますが、上手くいきません。 下記に作成しているプログラムを記載いたします。 正常終了をするには何がいけないのでしょうか? ご教授宜しくお願い致します。 [test.cc] ---------------------------------------------------------------- #include <time.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <ctype.h> #include <stdlib.h> #include <pthread.h> #include <stdlib.h> #include <sys/ipc.h> #include <sys/msg.h> // メソッドポインタ定義 typedef void (*testT); // スレッドID pthread_t threadId; // メッセージキュー識別子 int msqId; // 送受信するメッセージ struct msgbuf{ long int type; char data[BUFSIZ]; }; // テストスレッド void TestThread() { // メッセージ struct msgbuf message; while( 1 ) { printf("### TEST ###\n"); printf("msq start\n"); // 受信 if( msgrcv( msqId, &message, BUFSIZ, 0, 0 ) == -1) { printf("ERR! msgrcv errno[%d]\n", errno); continue; } printf("msq ed\n"); sleep(1); } return; } // メイン int main(int argc, char *argv[]) { // メッセージキュー識別子退避変数 int testMsqid; // スレッド操作リターン値 int status; // スレッドa用のパラメータ pthread_t thread_test; printf("### TEST START ###\n"); // メッセージキューの作成 if( (testMsqid = msgget((key_t)1111, 0666 | IPC_CREAT)) == -1 ) { printf("ERR! CREATE bkMsqId[%d]\n", testMsqid); return 1; } // メッセージキュー識別子を共通変数に設定 msqId = testMsqid; printf("msgget OK\n"); sleep(5); // スレッドを生成 status = pthread_create(&thread_test, NULL, (void*(*)(void*))TestThread, (void*)NULL); if(status!=0) { printf("pthread_create ng\n"); return 1; } printf("pthread_create OK\n"); sleep(5); // スレッド停止 status = pthread_cancel(thread_test); // スレッド停止結果 if ( status != 0 ) { printf("pthread_cancel ng\n"); return 1; } printf("pthread_cancel OK\n"); sleep(5); // メッセージキューの削除 if ( msgctl( msqId, IPC_RMID, NULL) == -1 ) { printf("msqId[%d] errno[%d]\n", msqId, errno); return 1; } printf("msgctl OK\n"); sleep(5); printf("### TEST E N D ###\n"); return 0; } ----------------------------------------------------------------

  • セッション変数のセキュリティ

    プログラム初心者です セッション変数の安全性について教えてください ログインしているかをセッション変数で判定しています。セッションidは使っていません 質問1 悪意をもったハッカーがセッション変数を取得することはできますか?それともセッション変数はクッキーと違い安全なんでしょうか? 質問2 セッション変数の保持時間は決まっていますか? session_start(); if(!isset($_SESSION['id'])){ header('Location: login.php'); exit(); } よろしくお願いします

    • ベストアンサー
    • PHP
  • シンボルをエクスポートするDLLの初歩的トラブル

    VC++6.0で簡単なDLL作成にチャレンジしたところ、ソースファイルの最後のところで、エンドオブファイルのエラーが出ます。教本と同じように書いたつもりですが、何処が異なっているのか分かりません。エラーを出す原因となっている箇所を御指摘下さい。 ↓ソースファイル #include "stdafx.h" #include "SUB.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } SUB_API LONG _stdcall subtract( LONG sub1 , LONG sub2 ) { return( sub1 - sub2 ); } ↓ここからはヘッダーファイル #ifdef SUB_EXPORTS #define SUB_API __declspec(dllexport) #else #define SUB_API __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif SUB_API LONG __stdcall subtract( LONG sub1, LONG sub2 ); #ifdef _cplusplus } #endif --------------------構成: SUB - Win32 Debug-------------------- コンパイル中... StdAfx.cpp コンパイル中... SUB.cpp C:\Program Files\Microsoft Visual Studio\MyProjects\SUB\SUB.cpp(38) : error C2059: 構文エラー : 'end of file' cl.exe の実行エラー SUB.dll - エラー 1、警告 0

  • youtube api HASH(0x856eaec)の謎

    googlenewsのapiにつづいてyoutubeのapiと格闘しています。 その際、TreePPモジュールを利用しているのですが、 どうしても解決できない問題があり、御相談させて下さい。 目標:youtubeのデータベースに人名で検索をかけ、その結果のリスト(XML)の中から、動画タイトルと動画IDを取り出す。 で、以下のプログラムで、動画IDは取り出せるのですが、動画タイトルの部分が HASH(0x856eaec) といた様な表示になってしまうのです。 ●どの様な状態の時に、HASH(0x856eaec)の様なものが表示されるのでしょうか(そもそも、これって何の値なんでしょうか?) ●動画タイトルを取り出すには、どの部分をどう修正すればいいのでしょうか? ●$ua->timeout(3);の部分で、タイムアウト処理をかましているつもりなのですが、どうも稼働している様には感じません。この様なプログラムの場合に、タイムアウト処理をかませるには、どうしたらよいのでしょうか? 以上3点、アドバイスいただければ幸です。 尚、当該xmlのタグ構造はコチラで確認していただけます。 http://gdata.youtube.com/feeds/api/videos?vq=aiko&start-index=1&max-results=50&orderby=relevance&alt=atom 以下、そのプログラムです。 ------------------------------ #!/usr/local/bin/perl print <<"HTML"; Content-type: text/html <html> HTML # 動画スタートnoを乱数で決める srand; $startno = rand; $startno =( int($startno * 6))+1; # モジュールのロード use Jcode; use XML::TreePP; # 検索単語の設定 $searchword = "aiko"; use Encode; #検索キーワードをUTF-8コードに変換する Encode::from_to($searchword , 'sjis', 'utf8'); #URLエンコードを行う $searchword=~s/([^0-9A-Za-z_])/'%'.unpack('H2',$1)/ge; $searchword=~s/\s/+/g; use LWP::UserAgent; use HTTP::Request; my $url = 'http://gdata.youtube.com/feeds/api/videos?vq='.$searchword.'&start-index='.$startno.'&max-results=50&orderby=relevance&alt=atom'; # XML::TreePPオブジェクトの作成 my $tpp = XML::TreePP->new( force_array => [ "entry" ], ); # parsehttpメソッドでURLからXMLデータを取得して $tree変数に格納 my $tree = $tpp->parsehttp( GET => "$url" ); $ua = LWP::UserAgent->new(); $tpp->set( lwp_useragent => $ua ); $ua->timeout(3); # [rss] - [channel] - [item] を $Items変数に格納 my $Items = $tree->{feed}->{entry}; # 検索結果を表示 foreach my $hash (@$Items){ $urlyou=$hash->{id}; $titleyou=$hash->{title}; $idyou = substr($urlyou,42,11); print "$titleyou".$idyou."<BR>"; }

    • ベストアンサー
    • Perl

専門家に質問してみよう