编译pthread时出错,pthread create表示多参数传递的结构类型错误

编译pthread时出错,pthread create表示多参数传递的结构类型错误,c,struct,pthreads,C,Struct,Pthreads,我正在尝试编译,但得到了错误 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 {

我正在尝试编译,但得到了错误

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);
arguments.str=str;
arguments.length=linesRead;
对于(int i=0;i
findMatch的原型是
void findMatch(char**str,const int length)

而且我认为我通过传递数组地址做了正确的事情,对吗


基本上,任何代码都可以更改,因此可以根据需要修改
findMatch()

您的函数必须符合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;
}

注意:您的代码提示可能存在问题的其他内容<代码>参数
是全局变量。这意味着,一旦启动一个线程,如果修改
参数
以准备下一个线程,您就创建了一个竞争条件,在这个条件下,您的修改可能会与初始线程对该内存的访问竞争。这在您的代码中并不是一个问题,因为在创建不同的线程时,您不会对
参数进行任何修改。但是如果你曾经这样做,考虑分配一个单独的<代码>参数< /C>变量来发送给每个线程,以便线程“拥有”它,并且只有它。< /P>线程函数必须有类型<代码>空隙*(空虚*)< /> >什么是<代码>空洞*(无效*)< /代码>?老实说,我甚至没有得到指向void类型的
void*
指针?获取一个void指针,返回一个void指针。您还需要什么?这不是一个问题,因为传递给pthread_create()的地址是作为全局变量创建的吗?@Celeritas您完全正确。我没看到它挂在那里。然而,这带来了一个完全不同的问题,我现在将记录它。@Celeritas ok。谢谢你接电话。我希望这现在是有道理的。无论如何,我希望您理解传递给
pthread\u create
启动线程的参数是如何工作的。这只是一个指向“某物”的指针,线程创建者和线程进程之间需要解决的细节。我只关心一件小事:编译器仍在抱怨
错误:“void”之前的预期表达式
(*void)
类型转换从
参数
中删除时,错误消失了。这是否表明存在问题?在C语言中,您永远不必在
void*
之间进行转换。如果您发现自己这样做了,那么一定是出了问题。只要
&参数
就足够了。