使用Pthread解释C中的基本多线程程序

时间:2013-01-31 16:27:44

标签: c multithreading

我正在尝试用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) ;

1 个答案:

答案 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库所期望的。