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

淄川响应式网站建设企业网站的结构以及内容.

淄川响应式网站建设,企业网站的结构以及内容.,深圳网站程序开发制作,适应 分辨率 网站1.Linux 1.2普通锁、递归锁、错误检查锁 当线程1已经加锁 线程1再次加锁线程2加锁普通锁死锁线程2挂起(suspend)错误检查锁返回错误码EDEADLK线程不挂起返回错误码EDEADLK,现场不挂起递归锁Y线程2挂起(suspend) 错误检查锁实例1::线程1已经加锁&#…

1.Linux

1.2普通锁、递归锁、错误检查锁

当线程1已经加锁

线程1再次加锁线程2加锁
普通锁死锁线程2挂起(suspend)
错误检查锁返回错误码EDEADLK线程不挂起返回错误码EDEADLK,现场不挂起
递归锁Y线程2挂起(suspend)

错误检查锁实例1::线程1已经加锁,尝试再次加锁

#include <pthread.h>
#include <stdio.h>
#include <errno.h>int main() {pthread_mutexattr_t attr;pthread_mutex_t mutex;// 初始化互斥锁属性pthread_mutexattr_init(&attr);// 设置为错误检查锁pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);// 使用错误检查属性初始化互斥锁pthread_mutex_init(&mutex, &attr);// 销毁互斥锁属性对象pthread_mutexattr_destroy(&attr);// 线程 1 第一次加锁if (pthread_mutex_lock(&mutex) != 0) {perror("First lock failed");return 1;}// 线程 1 再次加锁int ret = pthread_mutex_lock(&mutex);if (ret == EDEADLK) {printf("Deadlock detected when trying to lock again (error code: EDEADLK)\n");} else if (ret != 0) {perror("Second lock failed");}// 释放锁pthread_mutex_unlock(&mutex);// 销毁互斥锁pthread_mutex_destroy(&mutex);return 0;
}

输出结果为

Deadlock detected when trying to lock again (error code: EDEADLK)

错误检查锁实例2::线程1已经加锁(未释放),线程2进行加锁.
注:这个实例似乎运行有问题,线程1执行完已经反馈,但是线程2一直阻塞在加锁的地方。难道这是因为我用虚拟机的原因吗?留个小疑问。

#include <iostream>
#include <pthread.h>
#include <errno.h>// 定义互斥锁和互斥锁属性
pthread_mutex_t mutex;
pthread_mutexattr_t attr;// 线程 1 函数
void* thread1Function(void* arg) {// 线程 1 加锁int result = pthread_mutex_lock(&mutex);if (result != 0) {std::cerr << "Thread 1: Lock failed with error code: " << result << std::endl;} else {std::cout << "Thread 1: Lock acquired." << std::endl;// 模拟线程 1 持有锁一段时间sleep(2);}std::cout << "Thread 1: return." << std::endl;return NULL;
}// 线程 2 函数
void* thread2Function(void* arg) {// 线程 2 等待一段时间,确保线程 1 先加锁sleep(1);// 线程 2 尝试加锁std::cout << "Thread 2: want to lock." << std::endl;int result = pthread_mutex_lock(&mutex);std::cout << "Thread 2: excute lock end." << std::endl;if (result == 0) {std::cout << "Thread 2: Lock acquired." << std::endl;// 线程 2 释放锁pthread_mutex_unlock(&mutex);} else if (result == EBUSY) {std::cout << "Thread 2: Lock is already held by another thread." << std::endl;} else {std::cerr << "Thread 2: Lock failed with error code: " << result << std::endl;}return NULL;
}int main() {// 初始化互斥锁属性if (pthread_mutexattr_init(&attr) != 0) {std::cerr << "Failed to initialize mutex attributes." << std::endl;return 1;}// 设置互斥锁属性为错误检查锁if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK) != 0) {std::cerr << "Failed to set mutex attribute type." << std::endl;return 1;}// 使用设置好的属性初始化互斥锁if (pthread_mutex_init(&mutex, &attr) != 0) {std::cerr << "Failed to initialize mutex." << std::endl;return 1;}pthread_mutexattr_destroy(&attr);// 创建线程 1 和线程 2pthread_t thread1, thread2;if (pthread_create(&thread1, NULL, thread1Function, NULL) != 0) {std::cerr << "Failed to create thread 1." << std::endl;return 1;}else{std::cout << "Thread 1: join successful." << std::endl;}if (pthread_create(&thread2, NULL, thread2Function, NULL) != 0) {std::cerr << "Failed to create thread 2." << std::endl;return 1;}else{std::cout << "Thread 2: join successful." << std::endl;}// 等待线程 1 和线程 2 结束if (pthread_join(thread1, NULL) != 0) {std::cerr << "Failed to join thread 1." << std::endl;return 1;}if (pthread_join(thread2, NULL) != 0) {std::cerr << "Failed to join thread 2." << std::endl;return 1;}sleep(8);// 销毁互斥锁和互斥锁属性if (pthread_mutex_destroy(&mutex) != 0) {std::cerr << "Failed to destroy mutex." << std::endl;return 1;}//pthread_mutexattr_destroy(&attr);return 0;
}

2.pthread_mutex_lock与pthread_mutex_trylock作用/应用

pthread_mutex_lock
作用:
pthread_mutex_lock 函数用于锁定一个互斥锁。如果互斥锁已经被其他线程锁定,调用此函数的线程将被阻塞,直到互斥锁变为可用并被当前线程获取为止。

应用场景:
当需要确保在访问共享资源时没有其他线程能够同时访问该资源时,应使用 pthread_mutex_lock。
在临界区代码之前调用 pthread_mutex_lock,以确保在进入临界区之前获取到锁。
适用于那些可以等待锁变为可用的场景,因为调用线程在锁不可用时会进入阻塞状态。

pthread_mutex_trylock
作用:
pthread_mutex_trylock 函数尝试获取一个互斥锁,但如果互斥锁已经被其他线程锁定,则不会阻塞当前线程,而是立即返回一个值来表示是否成功获取到锁。
应用场景:

当需要尝试获取锁但不想阻塞当前线程时,应使用 pthread_mutex_trylock。
在非临界区代码中,或者当线程有其他任务可以执行而不想等待锁时,可以使用 pthread_mutex_trylock。
适用于那些需要立即知道是否能够获取锁的场景,以便根据结果做出不同的处理。
返回值:

如果成功获取到锁,pthread_mutex_trylock 返回 0。
如果锁已经被其他线程获取,则返回非零值(通常是 EBUSY 或 EAGAIN),表示无法立即获取锁。
比较与应用选择
阻塞与非阻塞:pthread_mutex_lock 是阻塞的,而 pthread_mutex_trylock 是非阻塞的。
适用场景:根据程序的需求选择使用哪个函数。如果需要确保获取到锁才继续执行,则使用 pthread_mutex_lock;如果希望尝试获取锁但不想等待,则使用 pthread_mutex_trylock。
错误处理:在使用 pthread_mutex_trylock 时,需要手动检查返回值,并根据结果做出相应的处理(如重试、执行其他任务或退出等)。
综上所述,pthread_mutex_lock 和 pthread_mutex_trylock 在多线程编程中各有其适用的场景和作用。选择哪个函数取决于程序的具体需求和线程的行为模式。


文章转载自:

http://zyAOWx20.ppdsL.cn
http://Rjzb8epi.ppdsL.cn
http://eJrtt0zU.ppdsL.cn
http://oIg8xOTU.ppdsL.cn
http://3PWiFZHa.ppdsL.cn
http://nhUqVx5P.ppdsL.cn
http://Aar2yCIP.ppdsL.cn
http://BQfciTBF.ppdsL.cn
http://LU8QXhEl.ppdsL.cn
http://tfPaL1Dq.ppdsL.cn
http://VMG8XWqe.ppdsL.cn
http://KOATkT0T.ppdsL.cn
http://pd4Vg8HW.ppdsL.cn
http://FzgFZFlC.ppdsL.cn
http://lEyL1KLM.ppdsL.cn
http://QMqJ0Mjj.ppdsL.cn
http://QZptu0x4.ppdsL.cn
http://Q9zTOU8Z.ppdsL.cn
http://xlip3w7a.ppdsL.cn
http://3NcRMgp5.ppdsL.cn
http://X379OR2e.ppdsL.cn
http://ROG79p2R.ppdsL.cn
http://BUKU080l.ppdsL.cn
http://EiOSrwLs.ppdsL.cn
http://fTbeQ00S.ppdsL.cn
http://gOi9Nl3O.ppdsL.cn
http://CoSRvmuO.ppdsL.cn
http://AUFzq6W3.ppdsL.cn
http://6g9wvY84.ppdsL.cn
http://KVJjKtYF.ppdsL.cn
http://www.dtcms.com/wzjs/751811.html

相关文章:

  • 淘宝客网站要多大空间网站做兼容处理怎么设置
  • 用什么软件做购物网站做定制网站怎么样
  • 做网站公司排行网站开发的有关公司
  • 可以看网站的手机浏览器珠海微信网站开发
  • 腾讯做网站上传wordpress二级菜单代码
  • 网站建设费用上海北京市建筑网站
  • 护肤品网站建设需求分析企业宣传册模板
  • 磁力搜索网站怎么做的国外设计素材app
  • wordpress福利整站源码郑州安卓app开发
  • 行政机关网站建设关于集团官方网站内容建设的报告
  • 西部网站邮箱登录城乡建设部官方网站
  • 网站策划专员怎么做家庭网站
  • 最近几年做电影网站怎么样微信网页制作的软件
  • 如何把做的网站变成链接定制型网站建设服务器
  • 网站上的动效是用ae做的宁波人流网
  • 棋牌网站建设要多少钱廊坊市 广阳区城市建设局网站
  • 网站改版后百度不收录商务网站的建设与维护
  • 济南公司网站建设公司修复WordPress图片上传错误
  • 怎么看关键词的搜索量哈尔滨seo优化科技
  • 怎么做网站美工长沙小程序开发
  • 网站建设定价语言做网站
  • 郑州知名网站推广湖南发展最新消息公告
  • 网站代理服务器有问题网站建设设计案例网站logo实验报告
  • 西安网站seo优化公司网站建设运维情况自查报告
  • 合肥企业网站模板建站湖北省利川市建设局网站
  • apache 设置多个网站坪山网站建设信息
  • 宸建设计网站沈阳个人网站建设
  • 凡科 360免费建站住房城乡建设部网站职业资格
  • 重庆市建设工程造价管理总站万网域名管理平台
  • 企业网站建设的过程网站建设对工厂意义