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

如果您不强制i转换为 void 指针,编译器会抱怨:

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 位;在这种情况下,您应该使用 long int 而不是 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

最好使用一个struct来发送更多参数:

struct PARAMS
{
    int i;
    char c[255];
    float f;
} params;

pthread_create(&thread_id, NULL, fun, (void*)(&params));

然后您可以cast params在以下PARAMS*位置使用它pthread routine

PARAMS *p = static_cast<PARAMS*>(params);
p->i = 5;
strcpy(p->c, "hello");
p->f = 45.2;
于 2017-12-05T10:49:32.410 回答
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 回答