unix/linux线程

线程简介

           线程

                 1.线程是操作系统运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。

                 2.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程

                     并行执行不同的任务。

                 3.线程是独立调度和分派的基本单位,线程可以为操作系统内核调度的内核线程,或者由内

                    核与用户进程,行混合调度。

                 4.同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和

                    信号处理等等,但同一进程中的多个线程有各自的调用栈,寄存器环境,线程本地存储。

                  5.一个进程可以有很多线程,每条线程并行执行不同的任务。

            线程属性

                   1.轻型实体:线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立

                      运行的资源。
                   2.独立调度和分派的基本单位:在多线程OS中,线程是能独立运行的基本单位,也是独立

                      调度和分派的基本单位。线程的切换非常迅速且开销小。
                   3.可并发执行:一个进程中的多个线程之间,可并发执行,允许在一个进程中所有线程都能

                      并发执行;不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并

                       行工作的能力。
                   4.共享进程资源:同一进程中的各个线程,都可以共享该进程所拥有的资源。所有线程

                      都具有相同的地址空间同一个进程内的线程共享内存和文件,所以线程之间互相通信

                      不必调用内核。

            线程与进程的区别

                    1.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程

                       在其它进程不可见。
                    2.通信:进程间通信IPC,线程间可以直接读写进程数据段。
                    3.调度和切换:线程上下文切换比进程上下文切快。
                    4.在多线程OS中,进程不是一个可执行的实体。

线程相关函数

            线程创建

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

                ​​​​​​​        参数:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        pthread_t *thread:pthread_t类型的指针变量,也可以地址。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​const pthread_attr_t *attr:建线程的属性,一般为NULL。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        void *(*start_routine) (void *):线程的操作函数,返回值的类型为void *类型。

                                void *arg:函数的实参,无传递数据时,arg为NULL。

                        返回值:

                                成功执行返回0

             线程退出

void pthread_exit(void *retval);

                        参数:

                                void **retval:线程结束的返回值,是阻塞的函数。

             线程回收

int pthread_join(pthread_t thread, void **retval);

                        参数:   

                                 thread:线程

                                 retval:收集线程退出的返回值

                         返回值:

                                  成功返回0

              线程锁

创建锁

pthread_mutex_t mutex; 

初始化锁
   
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);

销毁锁

pthread_mutex_destory(&mutex);

线程加锁

pthread_mutex_lock(&mutex);

线程解锁

pthread_mutex_unlock(&mutex);

                        参数:

                                mutex:锁

                                attr:锁的属性

                                        1:PTHREAD_MUTEX_TIMED_NP:attr为NULL,线程加锁后,其他请求锁

                                           的线程将形成一个等待队列,并在解锁后按照优先级获得锁。
                                         2:PTHREAD_MUTEX_RECURSIVE_NP:一个线程对同一个锁成功

                                            lock多次,并通过多次解锁,不同线程请求,解锁时竞争。
                                         3:PTHREAD_MUTEX_ERRORCHECK_NP:一个线程请求同一锁,则返

                                             回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。
                                         4:PTHREAD_MUTEX_ADAPTIVE_NP适应锁,最简单的锁类型,仅等待解

                                             锁后重新竞争。

                线程等待

创建

pthread_cond_t  cond;

线程等待

int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);

int pthread_cond_timedwait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,const struct timespec *restrict abstime);

                        参数:

                                abstime:绝对时间                                   

                                        struct timeval {

                                                                   time_t tv_sec;   //秒

                                                                   suseconds_t tv_usec;  //微妙

                                                                }

                        返回值:

                                成功返回0

                线程激发                          

广播激发所有等待

int pthread_cond_broadcast(pthread_cond_t *cond);

信号激发指定线程

int pthread_cond_signal(pthread_cond_t *cond);

   

demo1:

                创建线程,接收并打印线程结束标志,标志为hello  word(字符串)或 10(int) 

代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *func(void *param)
{
        //static int value = 100;
        static char *buf = "hello world";
        printf("param : %d\n",*((int *)param));
        printf("thread pid : %ld\n",(unsigned long)pthread_self());
        //pthread_exit((void *)&value);
        pthread_exit((void *)buf);
}

void result()
{
        pthread_t t;
        int param;
        int ret;
        //int *retvalue = NULL;
        char *retvalue = NULL;
        param = 10;
        ret = pthread_create(&t,NULL,func,(void *)&param);
        if(ret == 0)
        {
                printf("pthread create sucess\n");
                printf("main thread pid :%ld\n",(unsigned long)pthread_self());
                pthread_join(t,(void **)&retvalue);
                //printf("thread over sign : %d\n",*retvalue);
                printf("thread over sign : %s\n",retvalue);
        }
}

int main()
{
        result();
        return 0;
}

结果示例:            

 demo2:

                线程1,2加锁保证线程在执行锁内的程序时,不会被打扰

代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

pthread_mutex_t mutex;

void *func1(void *param)
{
        pthread_mutex_lock(&mutex);
        int num = 0;
        printf("t1 pthread pid : %ld\n",(unsigned long)pthread_self());
        for(num = 0;num < 5;num++)
        {
                printf("%d\n",(*((int *)param))++);
        }
        pthread_mutex_unlock(&mutex);
        pthread_exit(NULL);
}

void *func2(void * param)
{
        pthread_mutex_lock(&mutex);
        printf("t2 pthread pid : %ld\n",(unsigned long)pthread_self());
        int n;
        for(n = 0;n < 5;n++)
  {
        printf("%d\n",(*((int *)param))++);
  }
  pthread_mutex_unlock(&mutex);
  pthread_exit(NULL);
}

void result()
{
        pthread_t t1;
        pthread_t t2;
        int param;
        param = 10;
        printf("main pthread pid : %ld\n",(unsigned long)pthread_self());
        pthread_mutex_init(&mutex,NULL);
        pthread_create(&t1,NULL,func1,(void *)&param);
        pthread_join(t1,NULL);
        pthread_create(&t2,NULL,func2,(void *)&param);
        pthread_join(t2,NULL);
        pthread_mutex_destroy(&mutex);
}

int main()
{
        result();
        return 0;
}

  结果示例:                

demo3:   

                编写程序,每隔三秒,线程1给线程2发送信号,线程2开始运行

代码示例:  

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

pthread_mutex_t mutex;
pthread_cond_t con;
int i;

void *func1(void * param)
{
        while(1)
        {
                pthread_cond_wait(&con,&mutex);
                printf("t1 is running\n");
                i = 0;
        }
}

void *func2(void * param)
{
        while(1)
        {
                pthread_mutex_lock(&mutex);
                i++;
                printf("%d\n",i);
                pthread_mutex_unlock(&mutex);
                if(i == 3)
                {
                        printf("t1 start runing\n");
                        pthread_cond_signal(&con);
                }
                sleep(1);
        }
}

void result()
{
        pthread_t t1;
        pthread_t t2;
        int param;
        param = 10;
        pthread_mutex_init(&mutex,NULL);
        pthread_cond_init(&con,NULL);
        pthread_create(&t1,NULL,func1,(void *)&param);
        pthread_create(&t2,NULL,func2,(void *)&param);
        pthread_join(t1,NULL);
        pthread_join(t2,NULL);
        pthread_mutex_destroy(&mutex);
        pthread_cond_destroy(&con);
}

int main()
{
        result();
        return 0;
}

  结果示例:

​​​​​​​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值