>我正在尝试编译但收到错误
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()
。
您的函数必须符合 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
变量以发送到每个线程,以便线程"拥有"它,并且只有它。