使用c语言的posix线程

时间:2012-01-08 20:54:38

标签: c multithreading posix

#include <pthread.h>
#define NUM_THREADS 10

void *work(void *i){
      int f = *((int *)(i));
      printf("Hello, world from %i with value %i\n",
             pthread_self(), f);
      pthread_exit(NULL);
}
int main(int argc, char **argv){
      int i;
      pthread_t id[NUM_THREADS];
      for(i = 0; i < NUM_THREADS; ++i){
            if(pthread_create(&id[i], NULL, work, (void *)(&i))){
                  printf("Error creating the thread\n"); exit(19);}
      }
      return 0;
}

输出应该是:

Hello, world from 2 with value 1
Hello, world from 3 with value 2
Hello, world from 6 with value 5
Hello, world from 5 with value 5
Hello, world from 4 with value 4
Hello, world from 8 with value 9
Hello, world from 9 with value 9
Hello, world from 10 with value 9
Hello, world from 7 with value 6
Hello, world from 11 with value 10

这也不是一个功课。我在一些参考文献中遇到了一些代码,但posix不是我的领域,所以我只想要了解这一点的内容 我的问题是:

  • 这是什么意思int f = *((int *)(i)); ???我的意思是像这样写的指针我无法理解它们
  • 这是什么意思(void *)(&amp; i))
  • pthread_create成功返回零或非零值? - 在输出中让我们来看第一行,例如如何有价值1 !!因为我是零,所以它不应该是零
  • 我会影响这个输出吗?

3 个答案:

答案 0 :(得分:4)

  

这意味着什么int f = *((int *)(i)); ???

它将i转换为int *,取消引用它,并将值分配给f

  

这意味着什么(void *)(&i))

它指向i并将其强制转换为void *

  

pthread_create成功返回零或非零值吗?

pthread_create成功后返回零。

  

在输出中让我们以第一行为例,它是如何有价值1 !!因为我是零,所以它不应该是零

你是这么认为的,但事实并非如此。每个线程都是从所有其他线程异步执行的,并且在运行时读取i 的值,而不是在它启动时;因此,结果实际上是不可预测的。你在这里运行的程序看起来应该证明这种确切的效果。

  

++i会影响此输出吗?

呃......是吗?没有它,循环不会终止。

答案 1 :(得分:1)

  

这意味着什么是int f = *((int *)(i));

int f = *((int *)(i));表示将i强制转换为int*,然后取消引用此指针以获取该地址的int值。您可以将其分解为两个步骤:

int *temp = (int*)i;
int f = *temp;


  

这是什么意思(void *)(&amp; i))

(void *)(&i)只是将i的地址(main中的int*)转换为void*

  

pthread_create成功返回零或非零值吗?

从手册页:

  

返回值

  On  success,  pthread_create() returns 0; on error, it returns an error
  number, and the contents of *thread are undefined.


  

在输出中让我们以第一行为例,它是如何有价值1 !!因为我是零,所以它不应该是零

您将指向i的指针传递给线程函数,并且由于主线程和此新线程并行运行,i可以在for循环中更新(++i)在work

中访问之前


  

++我会影响这个输出吗?

是的,这是传递给你的线程函数的参数。它是输出中"...with value"之后的数字。

答案 2 :(得分:0)

首先,让我们看看:

f = *((int *)(i));

由于我是void *,因此无法在法律上取消引用,因此首先将其转换为int *,取消引用会提供类型为int的值。将i的地址变为空*是与此操作相反的;因为pthread函数接受void *,但是int的地址是int *类型,所以这个转换很好。

pthread_create在成功时返回零:http://pubs.opengroup.org/onlinepubs/007908799/xsh/pthread_create.html

是的,++ i影响输出,因为它将i递增1,因此下一个调度的线程函数将作为参数提供,其值大于前一个调用的值。这就是为什么“价值”在计划期间递增的原因。