-1

我正在尝试学习 C 中的多线程编程并尝试理解基本程序。我无法理解 runner 函数以及为什么它返回一个指向 void 类型的指针并传递一个也是指向 void 的指针的参数。另外,我无法理解 main 的参数。

int sum; / this data is shared by the thread(s) 
void *runner(void *param); / the thread 
int main(int argc, char *argv[])
{
 pthread_t tid; / the thread identifier /
 pthread.attr_t attr; / set of thread attributes /
if (argc != 2) {
fprintf(stderr,"usage: a.out <integer value>\n");
return -1;
}
if (atoi(argv[1]) < 0) {
fprintf(stderr,"%d must be >= 0\n",atoi(argv[1]));
return -1;
/ get the default attributes /
pthread.attr.init (&attr) ;
/ create the thread /
pthread^create(&tid,&attr,runner,argv[1]);
/ wait for the thread to exit /
pthread_join (tid, NULL) ;
printf("sum = %d\n",sum);
/ The thread will begin control in this function /
void *runner(void *param)
{<br />
int i, upper = atoi(param);
sum = 0;<br />
for (i = 1; i <= upper; i
sum += i;
pthread_exit (0) ;
4

1 回答 1

1

第一个参数mainargc是命令行参数的数量,包括程序名称。argv是一个指向零分隔字符串的指针数组,这些字符串本身就是参数。因此,如果您像这样从命令行运行程序:

myprog x y z

然后argc将是 4,argv看起来像这样:

argv[0]: "myprog"
argv[1]: "x"
argv[2]: "y"
argv[3]: "z"
argv[4]: ""

最后一个元素应该是一个空字符串。第一个元素(程序名称)的确切格式取决于操作系统和程序调用的确切方式。

您的runner函数是一种有时通常称为回调的函数。它由其他人(pthread 库)调用。为了让其他人调用你的函数,它必须知道它的返回类型和参数,所以这些都是固定的,即使它们不被使用。

所以runner必须返回一个void *(无类型指针)并接受一个void *参数,即使它实际上并没有使用任何一个(它可以返回NULL)。之所以如此,是因为这是 pthread 库所期望的。

于 2013-01-31T17:32:59.250 回答