向pthread_create()

时间:2015-11-06 02:38:19

标签: c linux multithreading

这是来自Linux编程接口的程序(原始代码here)。我想要做的是发送2"参数"使用pthread_create()进行threadFunc以实现下列目标:

  1. 第一个在threadFunc();中的for循环中充当迭代器;
  2. 第二个标识当前在threadFunc()中工作的线程。因此它将成为该线程的某种可打印ID。
  3. 为了实现这些目标,我创建了包含2个成员变量的结构:

    struct arguments {
        int loops;
        pthread_t self;
    };
    

    这个函数循环' threadFuncLoops'倍增全局变量' glob'

    static void * threadFunc(void *arg)
    {
        struct arguments * threadFuncArgs = arg;
        int threadFuncLoops = *(arg.loops);
    
        for (int j = 0; j < threadFuncLoops; j++) {
    
            // Something happens to glob
        }
    
        return NULL;
    }
    

    在main()中我创建了2个线程(t1,t2)并将它们发送到threadFunc():

        struct arguments newArguments;
    
        s = pthread_create(&t1, NULL, threadFunc, &newArguments);
    
        s = pthread_create(&t2, NULL, threadFunc, &newArguments);
    

    但编译器在threadFunc()

    中说
    request for member 'loops' in something not a structure or union
    

    我的问题是:

    1. 怎么来&#34;循环&#34;是不是在一个结构?它在结构实例中不是吗?
    2. 如何完全实现目标#2?
    3. 非常感谢。

2 个答案:

答案 0 :(得分:2)

您正在使用main函数中的newArguments地址并将其传递给您的线程函数。这意味着它不再是struct而是指针struct,因此您需要使用->

可以使用其他方式x->y (*x).y,看起来这可能是你试图通过{{1}实现的目标但是有两个问题:

  • 您尝试取消引用*(arg.loops)这不是指针 - 您应该args.loops;和
  • 无论如何,
  • (*args).loops是一个错误的取消引用类型,你需要一个指向结构的指针,所以它应该是args

因此,解决此问题的一种方法是使用此方法:

(*threadFuncArgs).loops

另外需要注意的事项。传递给两个线程的指针是指向完全相同的内存的指针。这意味着,如果其中一个线程发生更改(例如,结构中的struct arguments * threadFuncArgs = arg; int threadFuncLoops = threadFuncArgs->loops; 字段,则它将更改为两者。

通常情况下,你会以(至少)两种方式之一解决这个问题:

  • 有一个结构数组,并确保每个线程获得一个唯一的,只为自己;或
  • 让线程将其信息复制到本地存储中,但这需要进行一些重新设计以确保主函数在完成之前不会创建第二个线程。

答案 1 :(得分:1)

你必须使用“ - &gt;”。用threadFuncArgs-&gt;循环替换arg.loops。