我正在尝试用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) ;
答案 0 :(得分:1)
首先是main
的参数。 argc
是命令行参数的数量,包括程序名称。 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库所期望的。