0

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

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()可以根据需要进行修改。

4

1 回答 1

1

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

  • 返回void*
  • 取一个void*参数。

您在最后提供的参数地址将传递给您的线程 proc,并且您负责从那里解包您自己的参数。

尽量减少您需要的更改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变量以发送给每个线程,以便该线程“拥有”它,并且只有它。

于 2013-10-09T21:56:49.163 回答