6

整数の値をスレッドに渡したいだけです。

どうやってやるの?

私は試した:

    int i;
    pthread_t thread_tid[10];
    for(i=0; i<10; i++)
    {
        pthread_create(&thread_tid[i], NULL, collector, i);
    }

スレッド メソッドは次のようになります。

    void *collector( void *arg)
    {
        int a = (int) arg;
    ...

次の警告が表示されます。

    warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
4

4 に答える 4

6

ivoid ポインターにキャストしないと、コンパイラーは文句を言います。

pthread_create(&thread_tid[i], NULL, collector, (void*)i);

つまり、整数をポインターにキャストすることは厳密には安全ではありません。

ISO/IEC 9899:201x 6.3.2.3 ポインター

  1. 整数は、任意のポインター型に変換できます。前に指定された場合を除き、結果は実装定義であり、正しく配置されていない可能性があり、参照された型のエンティティを指していない可能性があり、トラップ表現である可能性があります。

そのため、各スレッドに個別のポインターを渡す方がよいでしょう。

各スレッドに配列内の個別の要素へのポインターを渡す完全な動作例を次に示します。

#include <pthread.h>
#include <stdio.h>

void * collector(void* arg)
{
    int* a = (int*)arg;
    printf("%d\n", *a);
    return NULL;
}

int main()
{
    int i, id[10];
    pthread_t thread_tid[10];

    for(i = 0; i < 10; i++) {
        id[i] = i;
        pthread_create(&thread_tid[i], NULL, collector, (void*)(id + i));
    }

    for(i = 0; i < 10; i++) {
        pthread_join(thread_tid[i], NULL);
    }

    return 0;
}

ここに pthreads の紹介があります。

于 2013-10-26T02:05:09.503 に答える
1

int は 32 ビット、void * は 64 ビット Linux では 64 ビットです。その場合、int の代わりに long int を使用する必要があります。

long int i;
pthread_create(&thread_id, NULL, fun, (void*)i);

int fun(void *i) 関数

 long int id = (long int) i;
于 2014-12-08T09:18:27.627 に答える
1
void *foo(void *i) {
    int a = *((int *) i);
    free(i);
}

int main {
    int *arg = (char*)malloc(sizeof(char))
    pthread_create(&thread, 0, foo, arg);
}
于 2017-06-02T08:45:48.647 に答える