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

旅游网站建设的背景意义今日新闻快讯

旅游网站建设的背景意义,今日新闻快讯,企业网络推广平台,桂林网站建站目录 一、同步的概念 为什么需要同步呢? 二、条件变量 条件变量的相关概念 1、条件变量的初始化:静态初始化、动态初始化 2、条件变量的等待:pthread_cond_wait函数 工作原理及流程【重要!】 关键点总结 3、条件变量的激…

目录

一、同步的概念

为什么需要同步呢?

二、条件变量

条件变量的相关概念

1、条件变量的初始化:静态初始化、动态初始化 

2、条件变量的等待:pthread_cond_wait函数

工作原理及流程【重要!】

关键点总结

3、条件变量的激发(通知)


一、同步的概念

此处的同步的概念和我们生活中所理解的同步并不是一回事。我们常说的同步,其意义更贴近于在在同一时间内同时执行多个任务,实际上,这在进程/线程调度的理念中叫做并行。

进程/线程间同步实际上所指的是协调多个线程或进程的执行顺序,以确保它们以一致和正确的方式访问共享资源。即:在保证数据安全的前提下, 让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题,叫做同步。

为什么需要同步呢?

  • 避免竞争条件: 当多个线程同时访问共享资源时,如果没有适当的同步机制,可能会出现竞争条件,导致不确定的结果。同步确保每次只有一个线程能访问共享资源。

  • 确保数据一致性: 多线程操作可能导致共享数据处于不一致的状态。同步机制确保数据在访问期间保持一致性。

  • 协调线程的执行: 同步用于控制线程的执行顺序和状态,确保线程在适当的时刻执行特定操作。

二、条件变量

在 Linux 中,条件变量(condition variable)是一个用于线程间同步的机制。它允许线程在某些条件满足之前挂起执行,并在条件满足时被唤醒。

条件变量的相关概念

  1. 条件变量(condition variable): 是一种同步机制,通常与互斥锁(mutex)一起使用。它用于实现线程间的等待和通知机制。

  2. 等待队列: 当线程在条件变量上调用 pthread_cond_wait 函数时,它会释放相关的互斥锁进入一个等待队列中此时线程会被挂起,直到另一个线程通过条件变量的 pthread_cond_signal 或 pthread_cond_broadcast 函数唤醒它。

  3. 互斥锁: 条件变量的使用必须与互斥锁配合使用,以确保在检查条件和改变条件时的原子性。

1、条件变量的初始化:静态初始化、动态初始化 

 静态初始化

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

解释:
这是静态初始化条件变量的方式。PTHREAD_COND_INITIALIZER 是一个宏,用于初始化条件变量 cond。该宏定义在 POSIX 线程库中,适用于在编译时已知的全局或静态条件变量。

优点:

  • 不需要额外的初始化函数调用。
  • 不需要手动销毁条件变量,生命周期随程序。

限制:

  • 仅适用于静态或全局条件变量的初始化。
  • 不能用于动态创建的条件变量。

动态初始化

int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);

参数:

  • cond:指向要初始化的条件变量的指针。该条件变量必须在使用之前被初始化。
  • attr:用于指定条件变量的属性。可以为 NULL,表示使用默认属性;也可以指定一个 pthread_condattr_t 结构体来设置自定义属性。

返回值:

  • 如果初始化成功,返回 0
  • 如果初始化失败,返回一个错误代码。

优点:

  • 适用于动态分配的条件变量。
  • 可以通过 attr 参数设置条件变量的特定属性。

使用示例:

pthread_cond_t cond;
pthread_cond_init(&cond, NULL);

在使用动态分配方法时,需要在不再需要条件变量时调用 pthread_cond_destroy 来销毁它,以释放相关资源!!!

2、条件变量的等待:pthread_cond_wait函数

条件变量的等待和通知机制依赖于互斥量(mutex),确保在检查和修改条件时的原子性。

函数原型

int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);

参数:

  • cond:指向条件变量的指针。
  • mutex:指向互斥量的指针。

返回值:

  • 成功时,返回 0
  • 失败时,返回一个错误代码(例如,EINVAL 或 EPERM)。
工作原理及流程【重要!】
  1. 持有互斥量: 调用 pthread_cond_wait 前,线程必须首先持有与条件变量相关联的互斥锁。这个互斥量保护了条件变量的状态和与之相关的数据。

  2. 挂起线程: 线程在 pthread_cond_wait 被调用时,会自动释放互斥锁,并进入等待队列中将自己挂起(阻塞)。这使得其他线程可以在条件变量上进行信号操作。

  3. 条件满足: 当条件满足时(通常由其他线程调用 pthread_cond_signal 或 pthread_cond_broadcast),挂起的线程会被唤醒。唤醒后,线程会重新竞争互斥锁,竞争成功后恢复执行。

  4. 检查条件: 唤醒后的线程需要重新检查条件是否满足。如果条件未满足,线程可能会再次调用 pthread_cond_wait 以继续挂起。通常,这种情况在一个 while 循环中处理,以应对虚假唤醒。

示例代码

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int condition = 0;void* waiting_thread(void* arg) {pthread_mutex_lock(&mutex);while (condition == 0) {printf("Waiting for condition...\n");pthread_cond_wait(&cond, &mutex);}printf("Condition met! Exiting...\n");pthread_mutex_unlock(&mutex);return NULL;
}void* signaling_thread(void* arg) {sleep(2); // Simulate some workpthread_mutex_lock(&mutex);condition = 1;pthread_cond_signal(&cond);printf("Condition signaled.\n");pthread_mutex_unlock(&mutex);return NULL;
}int main() {pthread_t waiter, signaler;pthread_create(&waiter, NULL, waiting_thread, NULL);pthread_create(&signaler, NULL, signaling_thread, NULL);pthread_join(waiter, NULL);pthread_join(signaler, NULL);pthread_cond_destroy(&cond);pthread_mutex_destroy(&mutex);return 0;
}
关键点总结
  1. 互斥量管理: 调用 pthread_cond_wait 之前,必须先锁定互斥量。条件变量在内部会自动解锁互斥量并挂起线程,然后在条件满足后再重新锁定互斥量。

  2. 条件检查: 使用 pthread_cond_wait 后,需要在 while 循环中检查条件,以处理可能的虚假唤醒(假设线程被唤醒时条件并未真正满足)。

  3. 虚假唤醒: pthread_cond_wait 可能会由于虚假唤醒而返回,即使条件尚未满足。因此,条件变量的等待通常放在 while 循环中,以确保条件的正确性。

  4. 通知机制: 其他线程可以使用 pthread_cond_signal 唤醒一个等待中的线程,或使用 pthread_cond_broadcast 唤醒所有等待中的线程。

  5. 销毁资源: 在使用完条件变量和互斥量后,应该调用 pthread_cond_destroy 和 pthread_mutex_destroy 来释放资源。

3、条件变量的激发(通知)

3.1、一次唤醒单个线程的函数:pthread_cond_signal

函数原型

int pthread_cond_signal(pthread_cond_t *cond);

参数:

  • cond:指向条件变量的指针。

返回值:

  • 成功时,返回 0
  • 失败时,返回一个错误代码(例如,EINVAL 或 EPERM)。

工作原理

  1. 持有互斥量: 调用 pthread_cond_signal 前,线程必须首先持有与条件变量相关联的互斥量。这个互斥量保护了条件变量的状态和与之相关的数据。

  2. 唤醒线程: 当 pthread_cond_signal 被调用时,至少有一个挂起的线程(等待条件变量)被唤醒(解除阻塞)。如果多个线程在等待同一个条件变量,通常会选择一个线程来唤醒。被唤醒的线程尝试重新获得互斥量以便继续执行。

  3. 继续执行: 被唤醒的线程退出 pthread_cond_wait 函数,并继续执行。一般地,它会重新检查它等待的条件,以确保它真的被激发的,而不仅仅是虚假唤醒。

3.2、一次唤醒全部线程的函数:pthread_cond_signal 

pthread_cond_broadcast 是 POSIX 线程库(pthread)中的一个函数,用于激发条件变量上所有等待的线程。与 pthread_cond_signal 不同,pthread_cond_broadcast 会唤醒所有等待在指定条件变量上的线程,而不仅仅是一个线程。这在某些情况下非常有用,例如:当条件变化会影响多个线程时。

函数原型

int pthread_cond_broadcast(pthread_cond_t *cond);

参数:

  • cond:指向条件变量的指针。

返回值:

  • 成功时,返回 0
  • 失败时,返回一个错误代码(例如,EINVAL 或 EPERM)。

工作原理

  1. 持有互斥量: 在调用 pthread_cond_broadcast 之前,线程必须持有与条件变量相关联的互斥量。这是为了保护条件变量及其相关的数据,并确保状态的原子性。

  2. 唤醒所有线程: 当 pthread_cond_broadcast 被调用时,它会唤醒所有在该条件变量上等待的线程。被唤醒的线程会尝试重新获得互斥量,然后继续执行。

  3. 重新检查条件: 被唤醒的线程会退出 pthread_cond_wait,但通常会重新检查它所等待的条件。如果条件未满足,它可能会再次调用 pthread_cond_wait,继续等待。这样做是为了处理虚假唤醒的情况。

 3.3、需要注意的点!!!

  • 虚假唤醒: 即便条件不满足,pthread_cond_wait 也可能因为虚假唤醒而返回。因此,依赖于条件变量等待的代码经常在 while 循环中检查条件,以确保线程确实被因为条件成立而唤醒:
pthread_mutex_t mutex;
pthread_cond_t cond;
int condition;// ...void wait_for_condition() {while (!condition) {pthread_cond_wait(&cond, &mutex);}// condition 现在为真,执行其他工作...
}

3.4、对比总结

  • pthread_cond_signal

    • 唤醒一个等待线程。
    • 适用于只需要通知一个线程的场景。
    • 可能更高效,尤其是在只需要唤醒一个线程的情况下,减少了不必要的线程唤醒开销。
  • pthread_cond_broadcast

    • 唤醒所有等待线程。
    • 适用于需要通知所有等待线程的场景。
    • 确保所有等待线程都能接收到条件变化,从而做出适当的响应。

 要真正的理解同步,我们还需借助代码来理解。下一节我们将介绍使用互斥锁与条件变量实现的生产者消费者模型。

http://www.tj-hxxt.cn/news/4931.html

相关文章:

  • 1 建设网站目的姓名查询
  • 网站改版iis301跳转如何做互联网运营主要做什么
  • 河北企业网站建设技术宁波网站推广找哪家
  • 茂名网站建设搜索引擎优化的策略主要有
  • 工信部门备案网站获取的icp备案号网站推广专家十年乐云seo
  • xampp网站后台洛阳seo网站
  • 优惠券怎么做自己的网站百度信息流推广是什么意思
  • 长春高铁建站优化推广公司哪家好
  • 常德网站制作公司多少钱南和网站seo
  • 做seo用什么网站系统活动推广方案策划
  • 网站开发用电脑配置南宁百度关键词排名公司
  • 网络服务商机构的顶级域名是什么搜索引擎优化心得体会
  • 推广策划沈阳百度快照优化公司
  • 全屋定制设计培训学校seo推广优化服务
  • 临沂企业自助建站世界球队最新排名
  • 域名价格查询评估seo免费
  • 呼市做网站的公司宁波seo外包哪个品牌好
  • 做暧免费观看网站品牌推广运营策划方案
  • 化妆品的网站建设百度推广代理开户
  • 现在去成都需要隔离吗?优化营商环境条例解读
  • 成都幼儿园网站建设百度有几个总部
  • 做cpa建什么网站好新郑网络推广外包
  • 网站备案 企业如何免费制作网站
  • 搭建 网站的环节官网seo是什么意思
  • 学院网站建设规划北京seo服务商
  • wordpress移除密码保护windows优化大师的功能
  • 泰安做网站网络公司汕头seo优化
  • 19楼网站模板关键词挖掘工具
  • 给个网站谢谢了楚雄seo
  • m 外贸网站成都高端网站建设哪家好