美文网首页
Linux thread 最基本用法

Linux thread 最基本用法

作者: WB莫遥燚 | 来源:发表于2017-03-26 22:00 被阅读400次

    要用到线程,但对线程一直不怎么懂,看了些资料作了两个例子和总结,不对的地方恳请各位指正。[喝小酒的网摘]http://blog.hehehehehe.cn/a/9143.htm
    1.基本函数
    pthread_create,pthread_detach,pthread_join,pthread_exit,pthread_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) main 用pthread_create产生一个线程,最主要的是后第三第四个参数,第三参数是完成线程的函数,第四参数是传给线程的参数。这里传的是一个整数, 如果线程完成的功能改为根据main需要产生x个值在[m, n)的随机数,可以将三个参数定义一个构造体传给线程。
    2) main用pthread_join等待线程完成退出后再退出,类似进程的wait函数。值得注意的是该函数的第二个参数,它指向线程的返回值,用了一个二级指针,不怎么明白。
    另外pthread_join与pthread_detach只能用其一。详见参考资料。
    <参考资料语>
    一 般情况下,进程中各个线程的运行都是相互独立的,线程的终止并不会通知,也不会影响其他线程,终止的线程所占用的资源也并不会随着线程的终止而得到释 放。正如进程之间可以用wait()系统调用来同步终止并释放资源一样,线程之间也有类似机制,那就是pthread_join()函数
    pthread_join() 的调用者将挂起并等待th线程终止,retval是pthread_exit()调用者线程(线程ID为th)的返回值,如 果thread_return不为NULL,则
    thread_return=retval。需要注意的是一个线程仅允许唯一的一个线程使用 pthread_join()等待它的终止,并且被等待的线程应该处于可join状态,即非DETACHED状态
    如 果进程中的某个线程执行了pthread_detach(th),则th线程将处于DETACHED状态,这使得th线程在结束运行时自行释放所占用的 内存资源,同时也无法由pthread_join()同步,pthread_detach()执行之后,对th请求pthread_join()将返回错 误
    一个可join的线程所占用的内存仅当有线程对其执行了pthread_join()后才会释放,因此为了避免内存泄漏,所有线程的终止,要么已设为DETACHED,要么就需要使用pthread_join()来回收
    3) 主线程用pthread_exit还是return
    用pthread_exit只会使主线程自身退出,产生的子线程继续执行;用return则所有线程退出。
    综 合以上要想让子线程总能完整执行(不会中途退出),一种方法是在主线程中调用pthread_join对其等待,即 pthread_create/pthread_join/pthread_exit或return;一种方法是在主线程退出时使用 pthread_exit,这样子线程能继续执行,即pthread_create/pthread_detach/pthread_exit;还有一种 是pthread_create/pthread_detach/return,这时就要保证主线程不能退出,至少是子线程完成前不能退出。现在的项目中 用的就是第三种方法,主线程是一个死循环,子线程有的是死循环有的不是。
    <参考资料语>
    理论上说,pthread_exit()和线程宿体函数退出的功能是相同的,函数结束时会在内部自动调用pthread_exit()来清理线程相关的资源。但实际上二者由于编译器的处理有很大的不同。
    在进程主函数(main())中调用pthread_exit(),只会使主函数所在的线程(可以说是进程的主线程)退出;而如果是return,编译器将使其调用进程退出的代码(如_exit()),从而导致进程及其所有线程结束运行。
    [喝小酒的网摘]http://blog.hehehehehe.cn/a/9143.htm

    相关文章

      网友评论

          本文标题:Linux thread 最基本用法

          本文链接:https://www.haomeiwen.com/subject/cexlottx.html