线程及其相关接口函数(Linux)

目录

一、线程

1、线程相关接口函数

(1)创建线程 pthread_create()

(2)结束线程 pthread_exit()

(3)等待进程 pthread_join()

2、线程间通信

(1)同步

(2)互斥


一、线程

每一个进程的地址空间是相互独立的

每一个进程都有一个task_struct任务结构体

在进行进程切换时,需要不断刷新cache缓存,比较消耗资源

为了减少cache刷新时的资源消耗,引入了轻量级进程--线程

线程特点:

同一个进程创建的多个线程,共用同一个进程的地址空间

进程创建线程后,我们把原本进程也称为线程,称为主线程

进程被称为最小的资源分配单位

线程称为CPU最小任务调度单位

线程公共数据:

用户名、用户组名

静态数据、全局数据

文件描述符

私有数据:

线程ID

pc

优先级、状态、属性

堆栈

 

1、线程相关接口函数

pthread_create -- 创建线程

pthread_exit -- 结束线程

pthread_join -- 等待线程

(1)创建线程 pthread_create()

       #include <pthread.h>

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

参数:
    thread:线程对象,一个线程对应一个线程对象
    attr:线程属性,填NULL表示使用默认选项
    start_routine:线程处理函数
    arg:给线程处理函数start_routine传参,如果线程处理函数没有参数,则填NULL;
返回值:
    成功返回0,失败返回错误编号
    

在编译跟线程操作相关的程序时,需要连接线程库

(2)结束线程 pthread_exit()

       #include <pthread.h>

       void pthread_exit(void *retval);
参数:
    retval:线程结束信息,由pthread_join等待接受,如果不想返回信息,填NULL

(3)等待进程 pthread_join()

       #include <pthread.h>

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

参数:
    thread:要等待的线程ID
	retval:它指向一个指针,后者指向线程的返回值
返回值:
    成功返回0;失败返回错误码

2、线程间通信

线程间的通信只需要利用全局变量就可以实现

在一个线程使用全局变量时,有可能其他线程也在访问该数据,那么某一线程使用的数据就有可能遭到破坏

解决办法:

通过线程的同步和互斥,能够达到数据保护的效果

(1)同步

多个线程之间按照事先约定好的顺序有先后的完成某个事件

信号量:是系统中的一种资源,本质是一个非负整数,信号量的值等于资源的个数

操作信号量只能通过特定函数接口才能访问:

信号量的初始化 -- sem_init()

       #include <semaphore.h>

       int sem_init(sem_t *sem, int pshared, unsigned int value);

参数:
    sem:信号量对象
    pshared:填0表示用于线程间同步
    value:信号量的初始值
返回值:

P操作(申请资源)-- sem_wait()

       #include <semaphore.h>

       int sem_wait(sem_t *sem);

 功能:

              if(是否有资源)
              {
                  执行后续代码;
                  信号量-1;
                      
              }else
              {
                  阻塞等待,直到有资源唤醒为止;
              }
                  
                 

V操作(释放资源)-- sem_post()

       #include <semaphore.h>

       int sem_post(sem_t *sem);

功能:

                信号量+1;
				if(有等待的资源的程序)
                {
                    将其唤醒;
                }

(2)互斥

当一个线程使用公共数据时,其他线程都不能访问该公共数据

临界资源:多个线程能够共同访问的数据

临界区:涉及到临界资源的代码模块

互斥是使用互斥锁保护临界区

互斥锁的相关操作接口函数:

1、互斥锁的初始化 -- pthread_mutex_init()

int pthread_mutex_init(pthread_mutex_t *mutex,pthread_mutex_t *attr);

参数:
    mutex:互斥锁对象
    attr:互斥锁使用,填NULL使用缺省属性
返回值:
    成功返回0,失败返回-1

2、申请锁 -- pthread_mutex_lock()

int pthread_mutex_lock(pthread_mutex_t *mutex);

参数:
    mutex:互斥锁对象

3、释放锁 -- pthread_mutex_unlock()

int pthread_mutex_unlock(pthread_mutex_t *mutex);

参数:
    mutex:互斥锁对象

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。 目 录 第1部分C++ 多线程系统编程 第1章线程安全的对象生命期管理3 1.1当析构函数遇到多线程. . . . . . . . . . . . . . . . .. . . . . . . . . . . 3 1.1.1线程安全的定义. . . . . . . . . . . . . . . . .. . . . . . . . . . . 4 1.1.2MutexLock 与MutexLockGuard. . . . . . . . . . . . . . . . . . . . 4 1.1.3一个线程安全的Counter 示例.. . . . . . . . . . . . . . . . . . . 4 1.2对象的创建很简单. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 5 1.3销毁太难. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 7 1.3.1mutex 不是办法. . . . . . . . . . . . . . . . . . . .. . . . . . . . 7 1.3.2作为数据成员的mutex 不能保护析构.. . . . . . . . . . . . . . 8 1.4线程安全的Observer 有多难.. . . . . . . . . . . . . . . . . . . . . . . . 8 1.5原始指针有何不妥. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 11 1.6神器shared_ptr/weak_ptr . . . . . . . . . .. . . . . . . . . . . . . . . . 13 1.7插曲:系统地避免各种指针错误. . . . . . . . . . . . . . . . .. . . . . . 14 1.8应用到Observer 上.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.9再论shared_ptr 的线程安全.. . . . . . . . . . . . . . . . . . . . . . . . 17 1.10shared_ptr 技术与陷阱. . . .. . . . . . . . . . . . . . . . . . . . . . . . 19 1.11对象池. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 21 1.11.1enable_shared_from_this . . . . . . . . . . . . . . . . . . . . . . 23 1.11.2弱回调. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . 24 1.12替代方案. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 26 1.13心得与小结. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 26 1.14Observer 之谬. . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 第2章线程同步精要 2.1互斥器(mutex). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.1.1只使用非递归的mutex . . . . . . . . . . . . . .. . . . . . . . . . 33 2.1.2死锁. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 35 2.2条件变量(condition variable). . . . . . . . . .

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值