当前位置: 首页 > wzjs >正文

网站开发人员招聘it管理宝塔wordpress经常502

网站开发人员招聘it管理,宝塔wordpress经常502,对酒店网站建设的意见,学校网站的常规化建设线程的同步互斥 这里我们不仅会介绍线程的同步互斥,也会介绍进程的同步互斥,比如信号量就可以实现线程或者进程间的同步互斥 知识点1【同步互斥的概念】 互斥:同一时间,只能执行一个任务(进程或者线程)&…

线程的同步互斥

这里我们不仅会介绍线程的同步互斥,也会介绍进程的同步互斥,比如信号量就可以实现线程或者进程间的同步互斥

知识点1【同步互斥的概念】

互斥:同一时间,只能执行一个任务(进程或者线程),谁先执行不确定

同步:同一时间,只能执行一个任务(进程或者线程),有顺序的执行

知识点2【互斥锁】

用于线程之间的互斥,不能用于同步

互斥锁是一种简单的加锁的方法来控制对共享资源的访问,互斥锁有两种状态:加锁和解锁。

这里我们使用C语言模拟一下这个过程

线程函数函数体:

while(1)//抢锁
{ if(flag == 0){  flag = 1;//加锁线程操作;flag = 0;//解锁}
}

其中flag 是一个进程中的全局变量。

下面我们详细介绍一下互斥锁的操作流程

互斥锁的操作流程

1、访问共享资源(执行线程操作)前,对互斥锁进行加锁

2、访问完成后解锁

注意:对互斥锁加锁后,任何其他试图再次对互斥锁再次加锁的线程都会被阻塞,知道锁被释放

互斥锁的类型:pthread_mutex_t

知识点3【互斥锁的API】

1、初始化锁 pthread_mutex_init()

  • 函数介绍

    #include <pthread.h>
    int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
    

    功能:

    初始化一个互斥锁

    参数:

    mutex:互斥锁地址,因为初始化函数会对锁的内容进行修改,因此需要地址

    attr:互斥量的属性,我们一般使用默认属性 NULL

    返回值:

    成功:0,成功申请的锁默认是打开的

    失败:非0错误码

    这里我们也可以使用另一种使用默认属性初始化互斥锁方式:在定义锁的时候使用宏

    phthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    

    这里大家注意,由于这种方式是宏,因此无法进行错误检测(宏替换在预处理阶段完成,不进行错误检测),因此我们一般不用这种方法

2、销毁互斥锁 pthread_mutex_destroy()

  • 函数介绍

    #include <phread.h>
    int pthread_mutex_destroy(pthread_mutex_t *mutex);
    

    功能:

    销毁指定的一个互斥锁。互斥锁使用完后,必须对互斥锁进行销毁,以释放资源

    参数:

    mutex:指定的互斥锁地址

    返回值:

    成功:0

    失败:非0错误码

3、申请上锁 pthread_mutex_lock()

  • 函数介绍

    #include <pthread.h>
    int pthread_mutex_lock(pthread_mutex_t *mutex);
    

    功能:

    对互斥锁上锁,如果互斥锁已经上锁,则调用者阻塞,直到互斥锁解锁后才能上锁

    参数:

    mutex:互斥锁地址

    返回值:

    成功:0

    失败:非0 错误码

    这里补充一个函数

    int pthread_mutex_trylock(pthread_mutex_t *mutex);
    

    尝试上锁,这个是不阻塞的,因此需要配合循环和条件判断 使用

    如果互斥锁没有上锁,则上锁,返回0;

    如果互斥锁已上锁,则函数直接返回失败,即EBUSY。

4、解锁 pthread_mutex_unlock()

  • 函数介绍

    #include <pthread.h>
    int pthread_mutex_unlock(pthread_mutex_t *mutex);
    

    功能:

    对指定的互斥锁解锁。

    参数:

    mutex:互斥锁地址

    返回值:

    成功:0

    失败:非0错误码

案例1 没有互斥锁的代码运行情况

我们这里封装一个函数void my_printf(char *arr),用来打印字符串,但是是每秒打印一个字符

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
//my_printf函数声明
void my_printf(char *arr);//线程1函数声明
void *my_fun01(void *arg);//线程2函数声明
void *my_fun02(void *arg);//这里的线程1,2函数功能是一样的,大家可以使用同一个函数,不会有影响,我这样写只是为了让代码功能更加直观int main(int argc, char const *argv[])
{//创建两个线程pthread_t tid1,tid2;pthread_create(&tid1,NULL,my_fun01,"hello");pthread_create(&tid2,NULL,my_fun02,"world");//释放线程pthread_join(tid1,NULL);pthread_join(tid2,NULL);return 0;
}
//my_printf函数实现
void my_printf(char *arr)
{while(*arr != '\\0'){printf("%c",*arr);fflush(stdout);//这个是必须的,因为上面没有行刷新,因此我们需要强制刷新刷新缓冲区//这里复习一下缓冲区的刷新方式 行刷新 慢刷新 结束刷新 强制刷新arr++;sleep(1);}
}
//线程1函数实现
void *my_fun01(void *arg)
{char *arr = (char *)arg;my_printf(arr);return NULL;
}
//线程2函数实现
void *my_fun02(void *arg)
{char *arr = (char *)arg;my_printf(arr);return NULL;
}

代码运行结果

可以看到代码的输出很随机

请仔细看注释,注释中补充了缓冲区的刷新方式,只是简述,大家忘记的自行利用AI查询即可

案例2 使用互斥锁的代码运行情况

代码演示

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
//互斥锁的定义
pthread_mutex_t mutex;//my_printf函数声明
void my_printf(char *arr);//线程1函数声明
void *my_fun01(void *arg);//线程2函数声明
void *my_fun02(void *arg);//这里的线程1,2函数功能是一样的,大家可以使用同一个函数,不会有影响,我这样写只是为了让代码功能更加直观int main(int argc, char const *argv[])
{//创建两个线程pthread_t tid1,tid2;//锁的初始化(默认是开锁状态)pthread_mutex_init(&mutex,NULL);pthread_create(&tid1,NULL,my_fun01,"hello");pthread_create(&tid2,NULL,my_fun02,"world");//释放线程pthread_join(tid1,NULL);pthread_join(tid2,NULL);//互斥锁已经使用完毕,销毁锁pthread_mutex_destroy(&mutex);return 0;
}
//my_printf函数实现
void my_printf(char *arr)
{while(*arr != '\\0'){printf("%c",*arr);fflush(stdout);//这个是必须的,因为上面没有行刷新,因此我们需要强制刷新刷新缓冲区//这里复习一下缓冲区的刷新方式 行刷新 慢刷新 结束刷新 强制刷新arr++;sleep(1);}
}
//线程1函数实现
void *my_fun01(void *arg)
{//加锁pthread_mutex_lock(&mutex);//线程1操作代码char *arr = (char *)arg;my_printf(arg);//解锁pthread_mutex_unlock(&mutex);return NULL;
}
//线程2函数实现
void *my_fun02(void *arg)
{//加锁pthread_mutex_lock(&mutex);//线程1操作代码char *arr = (char *)arg;my_printf(arg);//解锁pthread_mutex_unlock(&mutex);return NULL;
}

代码运行结果

  • 注意

    在互斥锁中,无论由几个线程都只能由一把锁,又因为需要需要每一个线程都识别,因此我们需要将锁定义在全局区

    大家注意看 定义锁的位置,以及线程函数中 锁的代码逻辑

这里大家可以看到,代码运行结果有序,并且是抢锁,并且没有顺序

这里我没有加返回值的判断,大家不要学,我偷懒了,追求严谨的同学可以加上,多谢理解

总结一下

如果是互斥,无论多少个任务,只需要一把锁

线程函数体的步骤:上锁,访问资源,解锁

知识点4【死锁】

死锁的概念

死锁是多线程(或多进程)并发编程中的一种资源竞争僵局,指两个或多个线程因争夺资源而陷入相互等待的状态,导致程序无法继续执行。

造成死锁的情况

造成死锁的原因有很多,这里我们简单介绍3种情况

这里我们以两个线程为例,分别为线程A,线程B

情况 1

线程A 上完锁 但是未解锁

解决方法:

上锁和解锁一一对应使用

情况 2

任务A种有两把锁 mute1,mute2,它的上锁顺序是mute1,mute2,解锁顺序是mute2,mute1

任务B种有两把锁 mute1,mute2,它的上锁顺序是mute2,mute1,解锁顺序是mute1,mute2

这是A,B抢锁,会是A抢到了mute1,B抢到了mute2,因为mute1和mute2 都只有 1把,因此都无法继续执行,都阻塞导致死锁

解决方法,多把锁按照下面要求

1、所有线程的上锁顺序相同

2、每个进程上锁顺序和解锁顺序相同

如下图表

开锁顺序和解锁顺序相同,是为了保证 得到第一把锁的 可以保证得到之后的锁,避免锁的随机分布

情况 3

当进程间通信时,读端先抢到锁,又因为read的阻塞特性,管道中因为没有写入数据而导致没有数据,进而导致阻塞,无法执行到 解锁部分,最终导致死锁

这种情况成为任务中的阻塞导致死锁

解决方法:

优化代码逻辑


文章转载自:

http://oFPZBjGr.nmszn.cn
http://UlW6FZPP.nmszn.cn
http://vMaOPjkY.nmszn.cn
http://EG3tMKWO.nmszn.cn
http://zvnMZiov.nmszn.cn
http://giiZANfl.nmszn.cn
http://r31spHag.nmszn.cn
http://Nipm6vcl.nmszn.cn
http://uTeJrDFY.nmszn.cn
http://AHCqtkI5.nmszn.cn
http://mIecrCjK.nmszn.cn
http://MsNCVy1J.nmszn.cn
http://q4PWxW78.nmszn.cn
http://JfaCASrx.nmszn.cn
http://nkO3VuLz.nmszn.cn
http://azREBl4X.nmszn.cn
http://SOzf9OgY.nmszn.cn
http://RUsf0f8C.nmszn.cn
http://lFKVjh7L.nmszn.cn
http://ONKvGIjx.nmszn.cn
http://0UJsE2Su.nmszn.cn
http://Rspbi8zd.nmszn.cn
http://JIj8903V.nmszn.cn
http://FT107SC1.nmszn.cn
http://3fym9tga.nmszn.cn
http://UXqX6wt1.nmszn.cn
http://X1rbxasV.nmszn.cn
http://IRXZ0olG.nmszn.cn
http://uHusiGH4.nmszn.cn
http://ZOLWxJit.nmszn.cn
http://www.dtcms.com/wzjs/780314.html

相关文章:

  • 中国空间站进展dw可以做网站后台吗
  • 网站制作的基础凡客诚品的衣服什么档次
  • 网站建设哪些好番禺网站建设价格
  • 广州海外建站外国人做的中国字网站
  • 网站图片要求临沂建网站哪家好
  • 定制设计网站深圳高速建设有限公司
  • 云南专业建网站建行个人网上银行登录入口官网
  • 专门做中式装修的网站网站文章正文可以做内链吗
  • 网络推广 公司 200个网站wordpress主题 收费
  • 大专学网站开发我们做的网站是优化型结构
  • 广州黄埔做网站020网站开发多少钱
  • 如何使网站做的更好wordpress怎么仿站
  • 贷款做网站三星网上商城官网app下载
  • 石家庄市住房建设局网站域名审核怎么做返利网站
  • 做搞笑图片的网站做外贸的网站有哪些
  • 手机网站开发有前途南宁网站制作最新招聘信息
  • 阿里备案成功后怎么做网站北京企业网站建设费用
  • 办公用品网站建设山东食品行业网站模板
  • 网站开发实训设计报告潍坊网站建设SEO优化
  • 网站建设完工报告兴化住房和城乡建设局网站
  • 龙元建设陕西公司网站网站建设运营协议
  • 网站开发的形式有( )怎么样查看网站开发语言
  • 苏州网站建设 公司在线制作印章diy印章
  • 合肥需要做网站的公司企业网站名是什么意思
  • 阿里网站建设方案书dw做网站时怎么改为绝对路径
  • 网站开发国外研究状况校园网站建设整改建议
  • 天津网站设计 河西网站开发建设成本
  • 哪些网站discuz做的设置网站建设方案
  • 网站制作哪家专业扬中网站建设推广
  • 湖南城乡住房建设厅网站山西公司注册网上核名