【问题标题】:Error compiling pthreads, pthread create says struct for multi argument pass is wrong type编译 pthread 时出错,pthread create 说多参数传递的结构是错误的类型
【发布时间】:2013-10-09 21:49:44
【问题描述】:

我正在尝试编译但收到错误

error: expected expression before 'void'
warning: passing argument 3 of 'pthread_create' from incompatible pointer type [enabled by default] used [-Wunused-but-set-variable]

我将结构类型转换为 void* 所以它应该可以工作。

在我的全局变量部分

struct threadArgs
{
    char** str;
    int length;
};
struct threadArgs arguments;

错误周围的线条在这里

arguments.str = str;
arguments.length = linesRead;
for(int i = 0; i < lettersInAlpha; i++)
    errCode[i] = pthread_create(&letter[i], NULL, &findMatch, (*void)&arguments);

findMatch 的原型是void findMatch(char **str, const int length);

另外我认为我通过传递数组地址来做正确的事情,对吧?

基本上任何代码都可以更改,所以findMatch()可以根据需要进行修改。

【问题讨论】:

  • 线程函数的类型必须为void * (void *)
  • 什么是void * (void *)?老实说,我什至没有得到 void * 指向 void 类型的指针?
  • 取一个 void 指针,返回一个 void 指针。你还需要什么?

标签: c struct pthreads


【解决方案1】:

您的函数必须符合 pthreads 作为有效线程进程的要求。部分合规性是签名。它必须是void *func(void*) 的形式。换句话说,您的函数必须:

  • 返回void*
  • 采用单个 void* 参数。

你在最后提供的参数地址被传递给你的线程进程,你负责从那里解包你自己的参数。

尽量减少findMatch 所需的更改,像这样声明你的线程函数:

void * findMatch(void* pv)
{
    struct threadArgs * argsp = pv;
    char **str = argsp->str;
    const int length = argsp->length;

    // the rest of your code.

    return NULL;
}

注意:您的代码暗示了可能是个问题。 arguments 是一个全球性的。这意味着一旦你启动一个线程,如果你修改arguments 为下一个线程做准备,你就创建了一个竞争条件,你的修改可能会与初始线程对该内存的访问竞争。这在您的代码中不是问题,因为您没有从线程到线程的创建中对arguments 进行任何修改。但是,如果您曾经这样做,请考虑分配一个单独的 arguments 变量以发送到每个线程,以便线程“拥有”它,并且只有它。

【讨论】:

  • 这不是问题吗,因为传递给 pthread_create() 的地址是作为全局变量创建的?
  • @Celeritas 你是绝对正确的。我没看到它挂在那里。然而,这带来了一个完全不同的问题,我现在将其记录下来。
  • @Celeritas 好的。谢谢你明白了。我希望现在说得通。无论如何,我希望您了解传递给pthread_create 启动线程的参数是如何工作的。它只是一个指向“某物”的指针,细节留待线程创建者和线程进程之间解决。
  • 只是我担心的一件小事:编译器仍在抱怨error: expected expression before 'void',当我从&amp;arguments 中删除类型转换(*void) 时,错误消失了。这是否表明存在问题?
  • 您永远不必在 C 中向 void* 转换或从 void* 转换。如果您发现自己这样做了,那就有问题了。只需&amp;arguments 就足够了。
猜你喜欢
  • 1970-01-01
  • 2012-09-03
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
相关资源
最近更新 更多