Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中如何将参数从线程传递到函数_C_Multithreading_Pthreads - Fatal编程技术网

在c中如何将参数从线程传递到函数

在c中如何将参数从线程传递到函数,c,multithreading,pthreads,C,Multithreading,Pthreads,我想将一个参数从main()传递到函数中。请让我知道我该怎么做。我在网上看到了一些方法,但都不管用。 代码如下: void *deliver(int *i) { int *ThreadID=(int *)tid; //Here I would like to do some comparing on arrays using i parameter //a[i]>b[i] As an example } void main () { pthread_

我想将一个参数从main()传递到函数中。请让我知道我该怎么做。我在网上看到了一些方法,但都不管用。 代码如下:

void *deliver(int *i)
{
    int *ThreadID=(int *)tid;

    //Here I would like to do some comparing on arrays using i parameter
    //a[i]>b[i] As an example

}

void main ()
{

    pthread_t t2_deliver[100];

    //input var
    printf("By using this code you can apply T threads on ordering list ;) \n");
    printf("->*******************************************************************************<-\n");
    printf("Please enter the number of threads(T):\n");
    scanf("%d",&threadnum);
    for (i=0; i<threadnum; i++)
    {
        pthread_create(&t2_deliver[i],NULL,deliver,&i);
    }
void*deliver(int*i)
{
int*ThreadID=(int*)tid;
//在这里,我想使用I参数对数组进行一些比较
//以a[i]>b[i]为例
}
空干管()
{
pthread_t t2_deliver[100];
//输入变量
printf(“通过使用此代码,您可以在订购列表上应用T线程;)\n”);

printf(“->***************************************************************************************************************************************************************************************您的代码中有一个逻辑错误。您创建的所有线程都将有一个指向相同的
i
的指针,这意味着它在所有线程中都具有相同的值,并且很可能超出创建循环后线程运行的界限

一种可能的解决方案是使用强制转换和标准
intptr\t
将值传递给线程函数:

pthread_create(..., (void*) (intptr_t) i);
在线程中:

void *deliver(int *p)
{
    int i = (int) (intptr_t) p;
    ...
}

代码中存在逻辑错误。您创建的所有线程都将有一个指向相同
i
的指针,这意味着它在所有线程中都具有相同的值,并且很可能超出界限,因为线程将在创建线程的循环后运行

一种可能的解决方案是使用强制转换和标准
intptr\t
将值传递给线程函数:

pthread_create(..., (void*) (intptr_t) i);
在线程中:

void *deliver(int *p)
{
    int i = (int) (intptr_t) p;
    ...
}

我看到的第一个错误是,您试图强制转换的不是I(函数参数)中的内容,而是某个变量tid中的内容

原则上线程功能(在您的情况下交付)接受作为参数的void指针,稍后可以将其转换为您发送的内容,因此为了遵守规则,我建议您更改函数定义,使其接受作为参数的void指针,而不是int指针。这应该没有什么区别,但更正确。为什么这样更好:void指针是指向我们不知道的某些数据的指针还不知道它是什么,所以我们需要在函数中转换它,这给了我们自由,我们可以传递给函数我们想要的任何东西,从简单的整数到复杂的结构。如果你想得到存储在作为函数参数传递的位置上的值,你可以用*运算符取消对它的引用。所以我建议你做些修改,谢谢广告功能应如下所示:

void *deliver(void *i){
    // in p there is integer pointer to argument i
    int *p = (int *)i;
    // now in ThreadID we have value of argument we passed to function in main (value at address i)
    int ThreadID = *p;

    //Here I would like to do some comparing on arrays using i parameter
    //a[i]>b[i] As an example
}
当创建线程只是为了正确地执行它时,我会这样做:

pthread_create(&t2_deliver[i],NULL,deliver,(void *)&i);
也许像指针类型这样的一些东西是不必要的,但我认为它更正确,根据我的经验,这很好,如果你正确地对它进行强制转换和取消引用,你就可以自由地传递任何你想要的函数。希望这对你有所帮助

更新和修复:

正如Jonathan Leffler在下面的评论中提到的,在for循环中传递i的地址(主函数)这是错误的,因为所有线程的参数都指向内存中的同一个整数i,实际上指向同一个值。有很多解决方法,Jonathan Leffler在下面提到了两种,我最喜欢的方法是构造id数组,然后攻击数组中的每个id并将其发送到每个线程:

ind tid[100];
for (int i = 0; i < 100; i++){
    tid[i] = i;
    pthread_create(&t2_deliver[i],NULL,deliver,(void *)&tid[i]);
}
indtid[100];
对于(int i=0;i<100;i++){
tid[i]=i;
pthread_create(&t2_deliver[i],NULL,deliver,(void*)&tid[i]);
}

对不起,我犯了一个错误。

我看到的第一个错误是,您试图转换的不是I(函数参数)中的内容,而是某个变量tid中的内容

原则上线程功能(在您的情况下交付)接受作为参数的void指针,稍后可以将其转换为您发送的内容,因此为了遵守规则,我建议您更改函数定义,使其接受作为参数的void指针,而不是int指针。这应该没有什么区别,但更正确。为什么这样更好:void指针是指向我们不知道的某些数据的指针还不知道它是什么,所以我们需要在函数中转换它,这给了我们自由,我们可以传递给函数我们想要的任何东西,从简单的整数到复杂的结构。如果你想得到存储在作为函数参数传递的位置上的值,你可以用*运算符取消对它的引用。所以我建议你做些修改,谢谢广告功能应如下所示:

void *deliver(void *i){
    // in p there is integer pointer to argument i
    int *p = (int *)i;
    // now in ThreadID we have value of argument we passed to function in main (value at address i)
    int ThreadID = *p;

    //Here I would like to do some comparing on arrays using i parameter
    //a[i]>b[i] As an example
}
当创建线程只是为了正确地执行它时,我会这样做:

pthread_create(&t2_deliver[i],NULL,deliver,(void *)&i);
也许像指针类型这样的一些东西是不必要的,但我认为它更正确,根据我的经验,这很好,如果你正确地对它进行强制转换和取消引用,你就可以自由地传递任何你想要的函数。希望这对你有所帮助

更新和修复:

正如Jonathan Leffler在下面的评论中提到的,在for循环中传递i的地址(主函数)这是错误的,因为所有线程的参数都指向内存中的同一个整数i,实际上指向同一个值。有很多解决方法,Jonathan Leffler在下面提到了两种,我最喜欢的方法是构造id数组,然后攻击数组中的每个id并将其发送到每个线程:

ind tid[100];
for (int i = 0; i < 100; i++){
    tid[i] = i;
    pthread_create(&t2_deliver[i],NULL,deliver,(void *)&tid[i]);
}
indtid[100];
对于(int i=0;i<100;i++){
tid[i]=i;
pthread_create(&t2_deliver[i],NULL,deliver,(void*)&tid[i]);
}

对不起,我的错误。

struct
s通常用于将数据分组在一起…因此,也许定义一个自定义数据段并传递指向该数据段的指针,而不仅仅是一个普通的整数指针,可以做到这一点…发布的代码不会编译。除此之外,它缺少所需的
\include
语句和调用系统函数(scanf,pghread)create()时,始终检查返回值以确保操作成功。发布的代码声明了一个包含100个“pthread\u t”元素的数组。(即最多100个线程,但与用户的交互既没有提到此限制,也没有检查用户输入的值,以确保其在签名的1…100范围内。)