Linux thread 最基本用法

关于POSIX thread的最基本用法

要用到线程,但对线程一直不怎么懂,看了些资料作了两个例子和总结,不对的地方恳请各位指正。

1.基本函数

pthread_createpthread_detachpthread_joinpthread_exitpthread_self

具体的意义和参数看man或者书吧,其他的函数还不会用。

2.基本用法

程序1

程序功能:main产生一个线程,线程根据main传来的参数产生几个60-100的随机数;main待线程退出后退出。

1 #include <stdlib.h>

2 #include <stdio.h>

3 #include <pthread.h>

4 #include <time.h>

5

6 int myRand(void* cnt)

7 {

8          int min = 60;

9          int max = 100;

10          int randCnt = *((int *)cnt);

11          int i = 0;

12          pthread_t thread_id = pthread_self();

13

14          /* init the random seed */

15          srand((unsigned int)time(NULL));

16          for(; i < randCnt; i ++){

17                  /* create random number in [60, 100) */

18                  printf("thread_id = %d rand()%02d = %d/n",

19                                  thread_id, i, min + rand() % (max - min));

20                  sleep(1);

21          }

22          //return 11;

23          pthread_exit((void*)11);

24 }

25

26 int main(int argc, char* argv[])

27 {

28          pthread_t tid;

29          void* result;

30          int reqRandCnt = 5;

31

32          if(pthread_create(&tid, NULL, (void *)myRand, (void *)&reqRandCnt) == 0){

33                  printf("myRand thread create OK!/n");

34                  //pthread_detach(tid);

35          }

36          if(pthread_join(tid, &result) == 0){

37                  printf("thread tid = %d, result = %d/n", tid, (int)result);

38          }

39          return 0;

40          //pthread_exit((void*)22);

41 }

一次运行结果:

thread_id = 1082367168 rand()00 = 95

myRand thread create OK!

thread_id = 1082367168 rand()01 = 71

thread_id = 1082367168 rand()02 = 63

thread_id = 1082367168 rand()03 = 81

thread_id = 1082367168 rand()04 = 66

thread tid = 1082367168, result = 11

几点说明

1) mainpthread_create产生一个线程,最主要的是后第三第四个参数,第三参数是完成线程的函数,第四参数是传给线程的参数。这里传的是一个整数,如果线程完成的功能改为根据main需要产生x个值在[m, n)的随机数,可以将三个参数定义一个构造体传给线程。

2) mainpthread_join等待线程完成退出后再退出,类似进程的wait函数。值得注意的是该函数的第二个参数,它指向线程的返回值,用了一个二级指针,不怎么明白。

另外pthread_joinpthread_detach只能用其一。详见参考资料。

<参考资料语>

一般情况下,程中各个线程的运行都是相互独立的,线程的止并不会通知,也不会影响其他线程,止的线程所占用的源也并不会随着线程的止而得到 放。正如程之可以用wait()统调用来同步止并源一线程之也有似机制,那就是pthread_join()函数

pthread_join()用者将挂起并等待th线止,retvalpthread_exit()用者线程(线IDth)的返回,如 thread_returnNULL*thread_return=retval。需要注意的是一个线唯一的一个线程使用 pthread_join()等待它的止,并且被等待的线应该处于可join,即非DETACHED

如果程中的某个线行了pthread_detach(th)th线程将DETACHED使得th线程在束运行自行放所占用的 内存源,同也无法由pthread_join()同步,pthread_detach()行之后,thpthread_join()将返回错误

一个可join线程所占用的内存当有线行了pthread_join()后才会放,因此了避免内存泄漏,所有线程的止,要么已设为DETACHED,要么就需要使用pthread_join()来回收

3) 主线程用pthread_exit还是return

pthread_exit只会使主线程自身退出,产生的子线程继续执行;用return则所有线程退出。

综合以上要想让子线程总能完整执行(不会中途退出),一种方法是在主线程中调用pthread_join对其等待,即pthread_create/pthread_join/pthread_exitreturn;一种方法是在主线程退出时使用pthread_exit,这样子线程能继续执行,即pthread_create/pthread_detach/pthread_exit;还有一种是pthread_create/pthread_detach/return,这时就要保证主线程不能退出,至少是子线程完成前不能退出。现在的项目中用的就是第三种方法,主线程是一个死循环,子线程有的是死循环有的不是。

<参考资料语>

pthread_exit()线程宿体函数退出的功能是相同的,函数会在内部自动调pthread_exit()来清理线程相关的源。实际上二者由于编译器的理有很大的不同。

程主函数(main())中pthread_exit(),只会使主函数所在的线程(可以程的主线程)退出;而如果是return编译器将使其程退出的代(如_exit()),从而程及其所有线束运行


 

你可能感兴趣的:(Linux thread 最基本用法)