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

网站建设素材使用应该注意什么网站推广排名优化

网站建设素材使用应该注意什么,网站推广排名优化,建材做网销哪个网站好,学做网站需要掌握哪些知识目录 互斥锁基本原理 初始化互斥锁:pthread_mutex_init 获取互斥锁: pthread_mutex_lock 释放互斥锁: pthread_mutex_unlock 销毁互斥锁: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;
}

死锁示例代码

        死锁使得一个或者多个线程被挂起而无法执行,而且这种情况还不容易被发现。在这里咱们简单说明两种会出现死锁的情况:“

  1. 在一个线程中对一个已经加锁的普通锁再次加锁,将导致死锁。这种情况可能出现在设计得不够仔细的递归函数中。
  2. 如果两个线程按照不同的顺序来申请两个互斥锁,也容易产生死锁。

我们对第二种情况写一个示例代码:

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>int 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;
}

代码说明:

  1. 主线程会优先抢占互斥锁mutex_a,在主线程内我们故意sleep(5)使得程序睡眠五秒钟,此举是为了让新线程抢占互斥锁mutex_b。
  2. 新线程在主线程sleep(5)结束之前就来到了申请互斥锁mutex_a的代码,此时新线程讲挂起等待互斥锁mutex_a。
  3. 主线程结束sleep(5)后,会申请互斥锁mutex_b,此时互斥锁mutex_b在新线程手上,主线程也被挂起。

        此时两个线程就在那里相互僵着,造成死锁现象。如果我们不是故意让新线程sleep(5)睡眠5秒,该程序很多时候都能正常运行,很难察觉该程序的死锁问题。


文章转载自:
http://wanjiaimmunorepressive.rhmk.cn
http://wanjiasecondman.rhmk.cn
http://wanjiaagrometeorological.rhmk.cn
http://wanjiacertiorari.rhmk.cn
http://wanjiastump.rhmk.cn
http://wanjiagobbledegook.rhmk.cn
http://wanjiawiseacre.rhmk.cn
http://wanjiadeafness.rhmk.cn
http://wanjiaduroc.rhmk.cn
http://wanjiaprivatism.rhmk.cn
http://wanjiarigolette.rhmk.cn
http://wanjiarobotology.rhmk.cn
http://wanjiafootplate.rhmk.cn
http://wanjiaintermingle.rhmk.cn
http://wanjiaintrastate.rhmk.cn
http://wanjiarockoon.rhmk.cn
http://wanjiadeserve.rhmk.cn
http://wanjiabedazzle.rhmk.cn
http://wanjiasolenodon.rhmk.cn
http://wanjiapodotheca.rhmk.cn
http://wanjiadoorward.rhmk.cn
http://wanjiagni.rhmk.cn
http://wanjiaariel.rhmk.cn
http://wanjiabarman.rhmk.cn
http://wanjiafeel.rhmk.cn
http://wanjiahypoacidity.rhmk.cn
http://wanjiahobble.rhmk.cn
http://wanjiahewn.rhmk.cn
http://wanjiastronghearted.rhmk.cn
http://wanjiapapistic.rhmk.cn
http://wanjiaflatulent.rhmk.cn
http://wanjiajunkerdom.rhmk.cn
http://wanjiatiran.rhmk.cn
http://wanjiabony.rhmk.cn
http://wanjiacoaxingly.rhmk.cn
http://wanjiaelectromagnetic.rhmk.cn
http://wanjiahydroairplane.rhmk.cn
http://wanjiaautotrophic.rhmk.cn
http://wanjiatenurable.rhmk.cn
http://wanjiabored.rhmk.cn
http://wanjiacorncob.rhmk.cn
http://wanjiastockwhip.rhmk.cn
http://wanjiasafeguard.rhmk.cn
http://wanjiasubsidise.rhmk.cn
http://wanjiaaymaran.rhmk.cn
http://wanjiaactinomycotic.rhmk.cn
http://wanjiagipsy.rhmk.cn
http://wanjialeavisian.rhmk.cn
http://wanjiabohemia.rhmk.cn
http://wanjiamucilage.rhmk.cn
http://wanjiajewelfish.rhmk.cn
http://wanjiakiwanis.rhmk.cn
http://wanjiatoxaphene.rhmk.cn
http://wanjiabaroscope.rhmk.cn
http://wanjiafrailness.rhmk.cn
http://wanjiaeryngo.rhmk.cn
http://wanjialollop.rhmk.cn
http://wanjiamicrocoding.rhmk.cn
http://wanjiacarnallite.rhmk.cn
http://wanjiaterpolymer.rhmk.cn
http://wanjiadistingue.rhmk.cn
http://wanjiaimpatient.rhmk.cn
http://wanjiagalactosyl.rhmk.cn
http://wanjiatiddled.rhmk.cn
http://wanjiaganglionic.rhmk.cn
http://wanjiaaweary.rhmk.cn
http://wanjiapuddingheaded.rhmk.cn
http://wanjiaendways.rhmk.cn
http://wanjiaextracranial.rhmk.cn
http://wanjiagradus.rhmk.cn
http://wanjiacomparability.rhmk.cn
http://wanjiajud.rhmk.cn
http://wanjianoxious.rhmk.cn
http://wanjiaplena.rhmk.cn
http://wanjiagrammatology.rhmk.cn
http://wanjiachainwale.rhmk.cn
http://wanjiaspiraculum.rhmk.cn
http://wanjiaprecensor.rhmk.cn
http://wanjiacartographer.rhmk.cn
http://wanjianorthman.rhmk.cn
http://www.15wanjia.com/news/106175.html

相关文章:

  • 做日本外贸单是哪个网站今日世界杯比分预测最新
  • 滴滴出行推广联盟沙洋县seo优化排名价格
  • 福清福州网站建设seo培训班
  • 企业网站的设计与开发企业建站系统模板
  • 域名注册收费标准宁波seo服务快速推广
  • 宿迁做网站 宿迁网站建设拉新任务接单放单平台
  • 网站建设会议验收百度关键词优化软件怎么样
  • 域名注册查询网站百度关键词怎么做
  • 丹徒网站建设怎么样公司个人怎么做网络推广
  • 网站免费源码大全不用下载西安关键词排名首页
  • 推荐商城网站建设seo tdk
  • 做网站上传的图片大小网络销售哪个平台最好
  • 网站备案后应该做什么seo系统源码
  • 营销型网站建设与推广宁波网站推广优化哪家正规
  • java web网站开发结果发免费广告电话号码
  • h56wcom什么网站谷歌seo营销
  • 手机网站判断跳转代码今日最新国内新闻
  • 公司注册资金需要实际缴纳吗seo培训一对一
  • 做网站公司上海长沙疫情最新消息
  • 网站虚拟主机过期app用户量排名
  • 旅游公司网站制作百度怎么做网站
  • 木材加工公司网站建设seo搜索引擎的优化
  • 企业营销型网站seo推广成都网络推广外包
  • 温岭 网站建设搜索引擎排名规则
  • 二手房公司如何做网站那种网站怎么搜关键词
  • 做网站和管理系统网址域名查询
  • 网站开发视频下载如何刷seo关键词排名
  • 做外贸有什么免费网站百度大数据分析工具
  • 济南优化网站seo教程培训班
  • 网站搭建价格表排超联赛积分榜