c语言——线程及线程间同步互斥

本文介绍了C语言中线程的概念及其操作,包括线程创建、线程同步和互斥。重点讲解了信号量、互斥锁和自旋锁的使用,通过示例代码阐述了如何在多线程环境中确保临界区的安全访问。
摘要由CSDN通过智能技术生成

线程操作

线程(thread)就是运行在进程上下文中的逻辑流。每个线程都有它自己的线程上下文(thread contxt),包括唯一的整数线程ID(Thread ID,TID)、栈、栈指针、程序计数器、通用目的的寄存器和条件码。
所有的运行在一个进程里的线程共享该进程的整个虚拟地址空间。

创建线程pthread_create

typedef  void *(func)(void *);			//return NULL;
int pthread_create(pthread_t *tid, pthread_attr_t *attr, func *f, void *arg);	//线程id,环境属性,线程函数,传递参数

返回:成功返回0,出错返回非0。attr_t 一般为 NULL

添加线程执行pthread_join

int pthread_join(pthread_t tid, void **thread_return);	//线程id,线程返回指针

返回:成功返回0,出错返回非0

退出线程pthread_exit

void pthread_exit(void *thread_return);

线程同步/互斥/临界区操作

  1. 信号量。无名信号量用作线程间临界区操作
  2. 互斥锁。信号量初始化为1时的特殊用法,互斥操作
  3. 自旋锁。不休眠一直循环的锁操作,用于临界区很快就可以执行完毕的情况。信号量与自旋锁会休眠等待
  4. 其他。读写锁,时间锁等等

信号量

信号量操作(线程间使用无名信号量,有名信号量用作进程间通信)

/*信号量定义*/
sem_t sem;

/*初始化信号量,类型为0则线程间通信,非0可以进行进程间通信*/
int sem_init(sem_t *sem, int pshared, unsigned int value);	//信号量对象,信号量类型,信号量的值
@@ 成功时返回 0;错误时,返回 -1,并把 errno 设置为合适的值。


/*信号量加减操作*/
int sem_wait(sem_t *sem);	//获取信号量 sem_wait是一个原子操作,它的作用是获取信号量并减一
int sem_post(sem_t *sem);	//也是一个原子操作,它的作用是信号量并加一
@@ 成功时返回 0;错误时,信号量的值没有更改,-1 被返回,并设置 errno 来指明错误

sem_destroy(sem_t *sem);	//销毁信号量

信号量代码示例:

#include <time.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值