pthreadのスレッド識別子pthread t型

提供: C言語入門
2014年5月10日 (土) 17:02時点におけるDaemon (トーク | 投稿記録)による版 (ページの作成:「pthreadのpthread_t型とは、スレッドのスレッド識別子(スレッドID)です。古い実装では、pthread_tは整数型でしたが、現在では、...」)

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索
スポンサーリンク

pthreadのpthread_t型とは、スレッドのスレッド識別子(スレッドID)です。古い実装では、pthread_tは整数型でしたが、現在では、必ずしも整数とは限らず、構造体へのポインタということもあり得ます。FreeBSDでは、pthread_tは、struct pthreadのポインタ型です。

読み方

pthread_t
ぴーすれっど あんすこ てぃー

概要

pthread_createで呼び出し元に、pthread_t型のスレッド識別子(スレッドID)が返されます。スレッド自身は、自身のスレッド識別子をpthread_self()で取得できます。

ヘッダファイル

FreeBSD 10.0-RELEASE
/usr/include/sys/_pthreadtypes.h
Ubuntu 14.04 amd64
/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h

ソースコード

FreeBSD 10.0-RELEASEの /usr/include/sys/_pthreadtypes.h の抜粋です。

/*
 * Forward structure definitions.
 *
 * These are mostly opaque to the user.
 */
struct pthread;
 
...
 
/*
 * Primitive system data type definitions required by P1003.1c.
 *
 * Note that P1003.1c specifies that there are no defined comparison
 * or assignment operators for the types pthread_attr_t, pthread_cond_t,
 * pthread_condattr_t, pthread_mutex_t, pthread_mutexattr_t.
 */
#ifndef _PTHREAD_T_DECLARED
typedef struct  pthread                 *pthread_t;
#define _PTHREAD_T_DECLARED
#endif

Ubuntuでは、以下の実装です。 Ubuntu 14.04の/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h からの抜粋です。

typedef unsigned long int pthread_t;


スレッドIDを取得する pthreadid1.c の例

ソースコード pthreadid1.c

#include <stdio.h>
#include <stdlib.h>
#include <err.h>
#include <pthread.h>
#include <unistd.h>
 
void f1();
void f2();
 
int main(void)
{
        pthread_t thread1, thread2;
        int ret1,ret2;
 
        ret1 = pthread_create(&thread1,NULL,(void *)f1,NULL);
        ret2 = pthread_create(&thread2,NULL,(void *)f2,NULL);
 
        if (ret1 != 0) {
                err(EXIT_FAILURE, "can not create thread 1");
        }
        if (ret2 != 0) {
                err(EXIT_FAILURE, "can not create thread 2");
        }
 
        printf("thread1: %p\n", thread1);
        printf("thread2: %p\n", thread2);
        ret1 = pthread_join(thread1,NULL);
        if (ret1 != 0) {
                err(EXIT_FAILURE, "can not join thread 1");
        }
 
        ret2 = pthread_join(thread2,NULL);
        if (ret2 != 0) {
                err(EXIT_FAILURE, "can not join thread 2");
        }
        return 0;
}
 
 
void f1()
{
        printf("%s: %p\n", __func__, pthread_self());
}
 
void f2()
{
        printf("%s: %p\n", __func__, pthread_self());
}

コンパイル

cc  -lpthread pthreadid1.c -o pthreadid1

実行例

% ./pthreadid1
thread1: 0x801406800
thread2: 0x801406c00
f2: 0x801406c00
f1: 0x801406800

関連項目




スポンサーリンク