Linux操作之进程与线程

栈是属于线程的,有几个线程,就会有几个栈;堆和代码段属于进程。

各个线程中的errno是独立的。

 

进程ID用pid_t来表示,它是一个unsigned int。

线程ID用pthread_t表示,但其不是整数。

 

捕捉信号最好只在主函数中捕捉。

例子如下:

void *func1(void *arg)

{

    int *p = (int *)arg;

扫描二维码关注公众号,回复: 2732276 查看本文章

    int i = *p;

    free(p);

    printf("pthread%dstart\n", i);

    static int a = 0;

    for(a = 0; a < i; a++)

    {

       printf("pthread%dhehe a = %d\n", i, a);

       sleep(1);

    }

    printf("pthread%dend\n", i);

    return NULL;

}

 

void createthr()

{

    pthread_t thrd1, thrd2;

    int *i1 = malloc(sizeof(int));

    int *i2 = malloc(sizeof(int));

    *i1 = 4;

    *i2 = 9;

    if (pthread_create(&thrd1, NULL, func1, i1) != 0)

    {

       printf("error is%s\n", strerror(errno));

    }

    if (pthread_create(&thrd2, NULL, func1, i2) != 0)

    {

       printf("error is %s\n", strerror(errno));

    }

    pthread_join(thrd1, NULL);//主线程挂起,等待thrd1退出

    pthread_join(thrd2, NULL);//主线程挂起,等待thrd2退出

    return;

}

 

int main(void)

{

    createthr();

    printf("mainend");

    return EXIT_SUCCESS;

}

 

为了让主线程省去去子线程收尸的过程,可以使用

int pthread_detach(pthread_t thread);

一旦线程成为可分离线程之后,就不能再使用pthread_join了

 

可分离线程的使用场景

1、主线程不需要等待子线程

2、主线程不关心子线程的返回码

例子如下:

void *func1(void *arg)

{

    printf("pthreadstart\n");

    while(1)

    {

       printf("pthreadliving\n");

       sleep(1);

    }

    printf("pthreadend\n");

    int *p = malloc(sizeof(int));

    *p = 2;

    return p;

}

 

void *func2(void *arg)

{

    sleep(5);

    pthread_t thr;

    thr = *(pthread_t *)arg;

    pthread_cancel(thr);

    int *p = malloc(sizeof(int));

    *p = 2;

    return p;

}

 

int main(void)

{

    pthread_t thrd1, thrd2;

    pthread_attr_t attr;

    pthread_attr_init(&attr);

    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//设置线程参数为可分离

    if (pthread_create(&thrd1, &attr, func1, NULL) !=0)

    {

       printf("error is%s\n", strerror(errno));

    }

    if (pthread_create(&thrd2, NULL, func2, &thrd1) != 0)

    {

       printf("error is%s\n", strerror(errno));

    }

    pthread_attr_destory(&attr);

    pthread_join(thrd1, NULL);//可分离后,pthread_join调用失败

    printf("mainend");

    return EXIT_SUCCESS;

}

 

//互斥锁的例子

pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;//初始化了一个MUTEX锁

 

void *func1(void *arg)

{

         pthread_mutex_lock(&mutex);//给mutex加锁,这是一条原子操作,不可能出现两个线程同时执行这个代码

         int*a = (int *) arg;

         printf("thread%dstart\n", *a);

         inti;

         for(i = 0; i < 10; i++)

         {

                   printf("thread%dis running\n", *a);

                   sleep(1);

         }

         printf("thread%dend\n", *a);

         pthread_mutex_unlock(&mutex);//给mutex解锁

         pthread_exit(NULL);

}

 

int main(int arg, char * args[])

{

         printf("processstart\n");

         pthread_tthr_d1, thr_d2;

         inti[2];

         i[0]= 1;

         i[1]= 2;

        

        

         pthread_create(&thr_d1,NULL, func1, &i[0]);

         pthread_create(&thr_d2,NULL, func1, &i[1]);

         pthread_join(thr_d1,NULL);

         pthread_join(thr_d2,NULL);

        

         printf("processend\n");

         return0;

}

 

//最恰当的互斥用法

#include <stdio.h>

#include <stdlib.h>

#include <pthread.h>

#include <errno.h>

#include <unistd.h>

#include <string.h>

 

pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;//初始化了一个MUTEX锁

 

int count = 0;

 

void *func1(void *arg)

{

         int*a = (int *) arg;

         printf("thread%dstart\n", *a);

         inti;

         for(i = 0; i < 10; i++)

         {

                   printf("thread%dis running\n", *a);

                   sleep(1);

                   pthread_mutex_lock(&mutex);//给mutex加锁,这是一条原子操作,不可能出现两个线程同时执行这个代码

                   count++;//这段代码受到保护,永远只有一个线程可以操作

                   pthread_mutex_unlock(&mutex);//给mutex解锁

         }

         printf("thread%dend\n", *a);

 

         pthread_exit(NULL);

}

 

int main(int arg, char * args[])

{

         printf("processstart\n");

         pthread_tthr_d1, thr_d2;

         inti[2];

         i[0]= 1;

         i[1]= 2;

 

         pthread_create(&thr_d1,NULL, func1, &i[0]);

         pthread_create(&thr_d2,NULL, func1, &i[1]);

         pthread_join(thr_d1,NULL);

         pthread_join(thr_d2,NULL);

 

         printf("processend\n");

         return0;

}

猜你喜欢

转载自blog.csdn.net/zangyongcan/article/details/52071245