gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:44:54 24 4
gpt4 key购买 nike

我正在尝试编译但出现错误

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 的原型(prototype)是 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;
}

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

关于c - 编译 pthread 时出错,pthread create 表示多参数传递的结构类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19283427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com