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

网站建设基础问题企业网站建设智恒网络

网站建设基础问题,企业网站建设智恒网络,重庆工程建设造价信息网站,什么样的网站高大上目录 互斥锁基本原理 初始化互斥锁#xff1a;pthread_mutex_init 获取互斥锁: pthread_mutex_lock 释放互斥锁: pthread_mutex_unlock 销毁互斥锁#xff1a;pthread_mutex_destroy 互斥锁基本使用代码 死锁示例代码 互斥锁基本原理 在多线程编程中pthread_mutex_init 获取互斥锁: pthread_mutex_lock 释放互斥锁: pthread_mutex_unlock 销毁互斥锁pthread_mutex_destroy 互斥锁基本使用代码 死锁示例代码 互斥锁基本原理         在多线程编程中互斥锁Mutex即 Mutual Exclusion 的缩写是一种最基本的同步机制用于保证在同一时刻只有一个线程能够访问共享资源从而避免竞态条件race condition的发生。竞态条件指的是多个线程同时访问和修改共享资源导致最终结果依赖于线程执行顺序的不确定情况。         互斥锁就像是一把锁线程在访问共享资源前需要先获取这把锁。如果锁是可用的即未被其他线程持有线程获取锁并访问共享资源如果锁已被其他线程持有那么该线程会被阻塞直到持有锁的线程释放锁它才有机会获取锁并继续执行。 大家可以先看一下这篇文章了解一下多线程下信号量的使用linux多线程之POSIX信号量-CSDN博客。其实互斥锁就跟信号量的值为1的情况下差不多。 初始化互斥锁pthread_mutex_init 函数原型 int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); 功能初始化一个互斥锁。参数 mutex指向要初始化的互斥锁变量的指针。attr用于指定互斥锁的属性如设置为 NULL则使用默认属性。默认属性下互斥锁是快速互斥锁适用于大多数场景。如果需要自定义互斥锁属性如设置为递归互斥锁允许同一线程多次获取锁可以先初始化一个 pthread_mutexattr_t 结构体通过相关函数设置属性后再传递给 pthread_mutex_init。 返回值成功时返回 0失败时返回非零错误码如 EAGAIN资源不足无法初始化互斥锁、EINVAL无效的属性等。 获取互斥锁: pthread_mutex_lock 函数原型 int pthread_mutex_lock(pthread_mutex_t *mutex); 功能尝试获取指定的互斥锁。如果互斥锁当前未被其他线程持有调用线程将获取锁并继续执行如果互斥锁已被其他线程持有调用线程会被阻塞直到互斥锁可用。参数mutex 指向要获取的互斥锁变量的指针。返回值成功时返回 0失败时返回非零错误码如 EINVAL无效的互斥锁、EDEADLK检测到死锁例如线程尝试获取自己已经持有的非递归互斥锁等。 释放互斥锁: pthread_mutex_unlock 函数原型 int pthread_mutex_unlock(pthread_mutex_t *mutex); 功能释放指定的互斥锁使其他等待该互斥锁的线程有机会获取锁并继续执行。参数mutex 指向要释放的互斥锁变量的指针。返回值成功时返回 0失败时返回非零错误码如 EINVAL无效的互斥锁、EPERM调用线程未持有该互斥锁却尝试释放它等。 销毁互斥锁pthread_mutex_destroy 函数原型 int pthread_mutex_destroy(pthread_mutex_t *mutex); 功能销毁一个已初始化的互斥锁释放与之相关的资源。在销毁互斥锁之前应确保没有线程持有该互斥锁。参数mutex 指向要销毁的互斥锁变量的指针。返回值成功时返回 0失败时返回非零错误码如 EBUSY互斥锁正在被使用、EINVAL无效的互斥锁等。 互斥锁基本使用代码 #include stdio.h #include stdlib.h #include pthread.h// 定义共享资源和互斥锁 int shared_resource 0; pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER;// 线程函数 void* increment_shared_resource(void* arg) {// 获取互斥锁pthread_mutex_lock(mutex);shared_resource;printf(Thread incremented shared_resource to %d\n, shared_resource);// 释放互斥锁pthread_mutex_unlock(mutex);return NULL; }int main() {const int num_threads 5;pthread_t threads[num_threads];// 创建线程for (int i 0; i num_threads; i) {if (pthread_create(threads[i], NULL, increment_shared_resource, NULL) ! 0) {perror(Thread creation failed);return 1;}}// 等待所有线程完成for (int i 0; i num_threads; i) {if (pthread_join(threads[i], NULL) ! 0) {perror(Thread join failed);return 1;}}return 0; } 死锁示例代码 死锁使得一个或者多个线程被挂起而无法执行而且这种情况还不容易被发现。在这里咱们简单说明两种会出现死锁的情况“ 在一个线程中对一个已经加锁的普通锁再次加锁将导致死锁。这种情况可能出现在设计得不够仔细的递归函数中。如果两个线程按照不同的顺序来申请两个互斥锁也容易产生死锁。 我们对第二种情况写一个示例代码 #include pthread.h #include unistd.h #include stdio.hint a 0; int b 0; pthread_mutex_t mutex_a; pthread_mutex_t mutex_b;void* another( void* arg ) {pthread_mutex_lock( mutex_b );printf( in child thread, got mutex b, waiting for mutex a\n );sleep( 5 );b;pthread_mutex_lock( mutex_a );b a;pthread_mutex_unlock( mutex_a );pthread_mutex_unlock( mutex_b );pthread_exit( NULL ); }int main() {pthread_t id;pthread_mutex_init( mutex_a, NULL );pthread_mutex_init( mutex_b, NULL );pthread_create( id, NULL, another, NULL );pthread_mutex_lock( mutex_a );printf( in parent thread, got mutex a, waiting for mutex b\n );sleep( 5 );a;pthread_mutex_lock( mutex_b );a b;pthread_mutex_unlock( mutex_b );pthread_mutex_unlock( mutex_a );pthread_join( id, NULL );pthread_mutex_destroy( mutex_a );pthread_mutex_destroy( mutex_b );return 0; }代码说明 主线程会优先抢占互斥锁mutex_a在主线程内我们故意sleep(5)使得程序睡眠五秒钟此举是为了让新线程抢占互斥锁mutex_b。新线程在主线程sleep(5)结束之前就来到了申请互斥锁mutex_a的代码此时新线程讲挂起等待互斥锁mutex_a。主线程结束sleep(5)后会申请互斥锁mutex_b此时互斥锁mutex_b在新线程手上主线程也被挂起。 此时两个线程就在那里相互僵着造成死锁现象。如果我们不是故意让新线程sleep(5)睡眠5秒该程序很多时候都能正常运行很难察觉该程序的死锁问题。
http://www.yayakq.cn/news/2469/

相关文章:

  • 天河低价网站建设哪里有零基础网站建设教学公司
  • 建设一个连接的网站个人网站有必要备案吗
  • 怎么上传网页到wordpress郑州seo地址
  • 模板网站建设珠海wordpress发布工具
  • 佛山建设工程交易中心网站教育类网站开发费用
  • 湖南响应式网站哪家好wordpress 解析插件
  • 手机网站和微网站wordpress统计访问量
  • 北京网站建设的服务公司自己搭建视频播放网站
  • 微信网站案例无极网络平台
  • 微信网站建设费用计入什么科目如何在手机上做微电影网站
  • 网站导出链接查询天津公司建站
  • 西安建站模板厂家网站建设业务前景
  • 方又圆网站建设百度关键词数据
  • 企业建设网站的主要目的有哪些服务公司的经营范围
  • 温州做网站哪里好建造自己的网站
  • 建网站的8个详细步骤昌乐建设局网站
  • 一个ip怎么做多个网站百度seo关键词点击软件
  • 如何构建个人网站安阳贴吧论坛
  • php精品网站建设连云港市建设工程安全监督站网站
  • 泰州营销型网站工程造价信息网官网信息价
  • 全国水利建设市场信用信息平台门户网站比较有设计感的网站
  • 寺庙网站开发建设方案安徽智能网站建设制作
  • 石家庄网站推广专业鑫菲互动网站建设公司
  • 网站名称写什么网易邮箱163登录入口
  • 成都网站排名app开发多少钱?
  • 网站导航插件wordpress第三方账号
  • 动画做a视频在线观看网站太原市手机微网站建设
  • 广告网站制作多少钱卓博人才网手机版
  • 网站开发技术有哪些网站推广具体内容
  • 不用买服务器可以做网站wordpress 不同侧边栏