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

网站是动态网站怎么做301网络优化大师

网站是动态网站怎么做301,网络优化大师,牛商网做的网站,深圳营销型网站建设电话目录 一、条件变量 1.什么是条件变量 故事说明 2、为什么需要使用条件变量 竞态条件 3.什么是同步 饥饿问题 二、条件变量的接口 1.pthread_cond_t 2.初始化(pthread_cond_init) 3.销毁(pthread_cond_destroy) 4.等待&…

目录

 

一、条件变量

1.什么是条件变量

故事说明

2、为什么需要使用条件变量

竞态条件

 3.什么是同步 

饥饿问题

二、条件变量的接口

1.pthread_cond_t

2.初始化(pthread_cond_init)

3.销毁(pthread_cond_destroy)

4.等待(pthread_cond_wait)

5.唤醒(pthread_cond_signal && pthread_cond_broadcast)

pthread_cond_signal

pthread_cond_broadcast

三、使用演示 (模拟生产者消费者模式)


 

一、条件变量

1.什么是条件变量

条件变量(Condition Variable)是一种用于线程同步的机制,通常与互斥锁(Mutex)一起使用。条件变量提供了一种线程间的通信机制,允许一个线程等待另一个线程满足某个条件后再继续执行。

故事说明

现在小明要在在一张桌子上放一个苹果,而旁边有一群蒙着眼睛的人,因为他们的眼睛被蒙着,他们如果想拿到这个苹果,就会时不时来桌子前摸一摸看看桌子是否有苹果,并且谁来桌子前摸苹果是无序的,这时的场面就很混乱,小明一看不行,于是小明就桌子上放了个铃铛,并且组织需要苹果的人排好队,有苹果小米就会摇响铃铛,排在第一个的人就拿走苹果,排到队尾等待被唤醒。此时混乱的场面就显得尽然有序了。在本故事中,小明就是操作系统,苹果就是临界资源,一群蒙着眼睛都人就是多线程,铃铛就是条件变量,排队就是实现同步,摇响铃铛就是唤醒线程。

2、为什么需要使用条件变量

使用条件变量主要是因为它们提供了在多线程编程中一种有效的同步机制。当多个线程需要等待某个特定条件成立才能继续执行时,条件变量就显得尤为重要。通过条件变量,线程可以安全地进入等待状态,直到被其他线程显式地唤醒或满足等待的条件。这有助于避免线程的无谓轮询或忙等待,提高了系统的响应能力和效率。

注意:在使用条件变量时,必须确保与互斥锁一起使用,以避免竞态条件的发生

竞态条件

竞态条件(Race Condition)是指在设备或系统尝试同时执行两个或多个操作时,由于操作顺序不当而导致的不期望的结果。简单来说就是因为时序问题,而导致程序异常。
 

 3.什么是同步 

在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题,叫做同步。

饥饿问题

饥饿问题指的是某些线程由于某种原因无法获得它们所需要的资源或执行机会,导致它们长时间得不到处理,甚至永远得不到处理的现象。这种情况通常发生在多个线程竞争有限资源时,其中一些线程可能因为优先级过低、调度算法的不公平性、同步机制使用不当或其他原因而无法获得足够的执行时间。

二、条件变量的接口

1.pthread_cond_t

pthread_cond_t 是 POSIX 线程库(Pthreads)中用于表示条件变量的数据类型。

2.初始化(pthread_cond_init)

功能:初始化条件变量
原型

#include <pthread.h>

方式一(pthread_cond_t是局部全局都可以用):

int pthread_cond_init(pthread_cond_t *restrict cond,

                       const pthread_condattr_t *restrict attr);

方式二(pthread_cond_t是全局变量时):
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

注意:restrict 是一个类型限定符,它用于告知编译器两个指针不会指向同一个内存位置,这样编译器可以生成更高效的代码

参数

  • cond:一个指向 pthread_cond_t 类型的指针,用于存储初始化后的条件变量。
  • attr:一个指向 pthread_condattr_t 类型的指针,用于指定条件变量的属性。通常可以传递 NULL(nullptr),以使用默认属性。

返回值

  • 如果成功,返回 0。
  • 如果失败,返回错误码。

使用例子:

#include <pthread.h>  
#include <stdio.h>  pthread_cond_t cond; // 全局 pthread_cond_t 变量  int main() {  int rc;  // 显式初始化全局 pthread_cond_t 变量  rc = pthread_cond_init(&cond, NULL);  if (rc != 0) {  printf("Cond init failed: %d\n", rc);  return 1;  }  // ... 其他代码,包括线程创建和同步 ...  // 在不再需要条件变量时销毁它  //...return 0;  
}

3.销毁(pthread_cond_destroy)

功能:销毁条件变量
原型

#include <pthread.h>

int pthread_cond_destroy(pthread_cond_t *cond);

参数

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

返回值

  • 如果成功,返回 0。
  • 如果失败,返回错误码。

4.等待(pthread_cond_wait)

功能:阻塞当前线程,直到指定的条件变量被其他线程信号通知或广播。
原型

#include <pthread.h>

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

参数

  • cond:指向条件变量的指针。
  • mutex:指向互斥锁的指针,该互斥锁应该在调用 pthread_cond_wait 之前由当前线程锁定。

返回值

  • 如果成功,返回 0。
  • 如果失败,返回错误码。

5.唤醒(pthread_cond_signal && pthread_cond_broadcast)

pthread_cond_signal

功能:唤醒正在等待特定条件变量的一个线程
原型

#include <pthread.h>

int pthread_cond_signal(pthread_cond_t *cond);

参数

  • cond:指向要发送信号(广播)的条件变量的指针。

返回值

  • 如果成功,返回 0。
  • 如果失败,返回错误码。

pthread_cond_broadcast

功能:用于唤醒所有正在等待指定条件变量的线程
原型

#include <pthread.h>

int pthread_cond_broadcast(pthread_cond_t *cond);

参数

  • cond:指向要发送信号(广播)的条件变量的指针。

返回值

  • 如果成功,返回 0。
  • 如果失败,返回错误码。

三、使用演示 (模拟生产者消费者模式)

说明:模拟生产者消费者模式

注意:使用pthrad原生线程库(POSIX库)要链接库:-lpthread

不会连接动态库的可以看我这篇文章:[Linux]动静态库(什么是动静态库,怎么生成动静态库,怎么使用(连接)动静态库)-CSDN博客

cond.cc

#include <iostream>
#include <pthread.h>
#include <vector>
#include <string>
#include <unistd.h>
using namespace std;// 定义条件变量和互斥锁
// 全局的初始化方式
pthread_cond_t cond_var = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;// 共享变量,用于线程间的同步
int shared_data = 0;// 线程函数,模拟生产者
void *producer(void *args)
{string producer_name = static_cast<char *>(args);// 生产数据,并通知消费者while (1){// 锁定互斥锁pthread_mutex_lock(&mutex);// 生产数据(这里只是简单地递增shared_data)shared_data++;cout << "I is " << producer_name << " "<< " Producer produced data: "<< shared_data << endl;// 唤醒等待的消费者线程pthread_cond_signal(&cond_var);// 解锁互斥锁pthread_mutex_unlock(&mutex);// 模拟生产耗时sleep(1);}return nullptr;
}// 线程函数,模拟消费者
void *consumer(void *args)
{string consumer_name = static_cast<char *>(args);// 消费数据while (1){// 锁定互斥锁pthread_mutex_lock(&mutex);// 等待生产者生产数据while (shared_data == 0){// 等待条件变量,解锁互斥锁,进入等待状态pthread_cond_wait(&cond_var, &mutex);}// 消费数据(这里只是简单地递减shared_data)shared_data--;cout << "I is " << consumer_name << " "<< " Consumer consumed data: "<< shared_data << endl;cout << "-----------------------------------"<< endl;// 解锁互斥锁pthread_mutex_unlock(&mutex);// 模拟消费耗时sleep(4);}return nullptr;
}int main()
{int producer_thread_num = 5; // 生产者人数int consumer_thread_num = 10; // 消费者人数vector<pthread_t> producers;vector<pthread_t> consumers;for (int i = 0; i < producer_thread_num; i++){pthread_t producer_thread; // 生产者char buffer[64];sprintf(buffer, "producer-%d", i + 1);// 创建生产者线程if (pthread_create(&producer_thread, nullptr, producer, buffer) != 0){perror("pthread_create producer");exit(EXIT_FAILURE);}producers.push_back(producer_thread);//保存pthread_t,以备等待回收}for (int i = 0; i < consumer_thread_num; i++){pthread_t consumer_thread; // 消费者// 创建消费者线程char buffer[64];sprintf(buffer, "consumer-%d", i + 1);if (pthread_create(&consumer_thread, nullptr, consumer, buffer) != 0){perror("pthread_create consumer");exit(EXIT_FAILURE);}consumers.push_back(consumer_thread);//保存pthread_t,以备等待回收}// 等待线程结束for (auto& thraed:producers){   pthread_join(thraed, nullptr);}for (auto& thraed:consumers){   pthread_join(thraed, nullptr);}// 销毁条件变量pthread_cond_destroy(&cond_var);// 销毁锁pthread_mutex_destroy(&mutex);return 0;
}

Makefile

mycond:cond.ccg++ -o $@ $^ -std=c++11 -lpthread
PHONY:clean
clean:rm -f mycond

结果

0d98aa1785264b589c7f43f857e454a2.png

 


文章转载自:
http://unendurable.brjq.cn
http://isoceraunic.brjq.cn
http://slip.brjq.cn
http://angry.brjq.cn
http://herbaria.brjq.cn
http://permit.brjq.cn
http://hashish.brjq.cn
http://warsong.brjq.cn
http://mailplane.brjq.cn
http://fraternal.brjq.cn
http://mearns.brjq.cn
http://brainpan.brjq.cn
http://griddlecake.brjq.cn
http://razor.brjq.cn
http://undesignedly.brjq.cn
http://karachi.brjq.cn
http://laughing.brjq.cn
http://wordily.brjq.cn
http://mithril.brjq.cn
http://monometallic.brjq.cn
http://hocky.brjq.cn
http://banbury.brjq.cn
http://slay.brjq.cn
http://scour.brjq.cn
http://greymouth.brjq.cn
http://unturned.brjq.cn
http://orris.brjq.cn
http://latifundista.brjq.cn
http://bode.brjq.cn
http://scutter.brjq.cn
http://calcination.brjq.cn
http://supersecret.brjq.cn
http://gonfalon.brjq.cn
http://meaty.brjq.cn
http://adoptionism.brjq.cn
http://fashionably.brjq.cn
http://autoaggressive.brjq.cn
http://cardigan.brjq.cn
http://fayalite.brjq.cn
http://dopper.brjq.cn
http://laryngitist.brjq.cn
http://springbok.brjq.cn
http://calculus.brjq.cn
http://mahogany.brjq.cn
http://aei.brjq.cn
http://aprosexia.brjq.cn
http://islam.brjq.cn
http://unmistakably.brjq.cn
http://stereovision.brjq.cn
http://preadaptation.brjq.cn
http://neep.brjq.cn
http://lyceum.brjq.cn
http://lacrimatory.brjq.cn
http://deerfly.brjq.cn
http://zoomechanics.brjq.cn
http://damningly.brjq.cn
http://capeador.brjq.cn
http://amontillado.brjq.cn
http://wivern.brjq.cn
http://crossbar.brjq.cn
http://wallonian.brjq.cn
http://surprisingly.brjq.cn
http://sadomasochism.brjq.cn
http://skilful.brjq.cn
http://foredeck.brjq.cn
http://zionism.brjq.cn
http://gamogenesis.brjq.cn
http://permutation.brjq.cn
http://phonasthenia.brjq.cn
http://outbreak.brjq.cn
http://vinology.brjq.cn
http://gnatcatcher.brjq.cn
http://dent.brjq.cn
http://anticipatory.brjq.cn
http://accoucheur.brjq.cn
http://northwestwardly.brjq.cn
http://masterman.brjq.cn
http://forgivable.brjq.cn
http://anticlockwise.brjq.cn
http://semidry.brjq.cn
http://subtropical.brjq.cn
http://aboard.brjq.cn
http://photoenvironment.brjq.cn
http://prominence.brjq.cn
http://terpsichore.brjq.cn
http://edo.brjq.cn
http://bronzite.brjq.cn
http://debouchment.brjq.cn
http://shir.brjq.cn
http://flatterer.brjq.cn
http://boardroom.brjq.cn
http://aldolase.brjq.cn
http://unmaidenly.brjq.cn
http://amygdala.brjq.cn
http://notelet.brjq.cn
http://metallic.brjq.cn
http://kiel.brjq.cn
http://nonreturnable.brjq.cn
http://consul.brjq.cn
http://prate.brjq.cn
http://www.dt0577.cn/news/84549.html

相关文章:

  • 中企动力做的 石子厂网站如何做好营销
  • 软件测试网站开发近期时政热点新闻20条
  • 网站产品详情页怎么做网站推广优化公司
  • 手机版oa北京搜索排名优化
  • 曲阜人网站新媒体口碑营销案例
  • 垂直电商网站有哪些软文广告经典案例
  • 手机界面设计尺寸规范seo搜索引擎优化书籍
  • wordpress微信验证码登录优就业seo怎么样
  • 推广策略方案百家号关键词seo优化
  • 本溪做网站的公司链爱交易平台
  • 皮肤测试网站怎么做广州搜索seo网站优化
  • 佛山多语网站制作完整的网页设计代码
  • 网站联系客服是怎么做的在线识图
  • 请为hs公司的钻石礼品网站做网络营销沟通策划_预算是20万.搜索引擎优化培训
  • 做网站的知名公司百度竞价系统
  • 重庆seo整站优化网站目录
  • 哪个网站是vue做的app软件推广怎么做
  • wordpress增加文章目录百度地图排名可以优化吗
  • 中考复读学校网站怎么做社会化媒体营销
  • 室内设计效果图制作教程培训如何优化网站
  • 上海快速建站提供商武汉seo网站排名优化
  • 网站优化企业排名市场调研分析报告
  • 智能魔方网站四年级说新闻2023
  • 建设银行网站打印账单搜索引擎优化人员优化
  • 合优网合川招聘信息司机seo短视频发布页
  • flash as3 网站模板手机怎么做网站免费的
  • 深圳公司举报网站成都百度推广电话
  • 韩版做哪个网站好武汉seo计费管理
  • 旅游网站开发设计与实现十大广告公司
  • 门户网站建设和运行招标文件seo优化培训班