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

1年网站上传文章的网站

1年网站,上传文章的网站,凡科教育小程序怎么样,建筑图纸符号大全解释C笔记之信号量、互斥量与PV操作 文章目录 C笔记之信号量、互斥量与PV操作1.信号量概念2.信号量例程一3.信号量例程二4.信号量例程三5.互斥量6.PV操作概念7.PV操作详解——抄自#xff1a;https://mp.weixin.qq.com/s/vvjhbzsWQNRkU7-b_dURlQ8.PV操作的英文全称 1.信号量概念 …C笔记之信号量、互斥量与PV操作 文章目录 C笔记之信号量、互斥量与PV操作1.信号量概念2.信号量例程一3.信号量例程二4.信号量例程三5.互斥量6.PV操作概念7.PV操作详解——抄自https://mp.weixin.qq.com/s/vvjhbzsWQNRkU7-b_dURlQ8.PV操作的英文全称 1.信号量概念 C中的信号量是一种同步原语用于在多线程或多进程环境中管理资源的访问和控制并发访问的方式。信号量主要用于协调不同线程或进程之间对共享资源的访问以确保互斥性和同步性。 信号量有两种常见的类型二进制信号量和计数信号量。 二进制信号量Binary Semaphore也称为互斥锁Mutex它只能取两个值通常是0和1。它用于实现互斥访问即同一时间只允许一个线程或进程访问共享资源。当一个线程或进程获得了二进制信号量其他尝试获取的线程或进程将被阻塞直到信号量被释放。 计数信号量Counting Semaphore计数信号量可以取多个值通常是非负整数。它用于控制同时访问共享资源的数量允许多个线程或进程访问资源但可以限制并发访问的数量。线程或进程可以等待信号量的计数增加以获得访问权限或者通过释放信号量来减少计数。 信号量通常具有两个主要操作 Wait等待操作线程或进程尝试获取信号量。如果信号量的计数不满足要求例如计数为0则线程或进程将被阻塞直到条件满足。Signal通知操作线程或进程释放信号量增加计数。这通常是在使用完共享资源后执行的操作以通知其他等待的线程或进程。 信号量是多线程和多进程编程中重要的同步工具用于避免竞态条件和确保数据的一致性。在C中你可以使用标准库提供的互斥锁、条件变量以及其他同步原语来实现信号量或者使用第三方库中提供的信号量实现如Boost C库中的信号量。 2.信号量例程一 运行 代码 #include condition_variable #include iostream #include mutex #include threadclass Semaphore {public:Semaphore(int count 0) : count_(count) {}void notify() {std::unique_lockstd::mutex lock(mutex_);count_;cv_.notify_one();}void wait() {std::unique_lockstd::mutex lock(mutex_);while (count_ 0) {cv_.wait(lock);}count_--;}private:std::mutex mutex_;std::condition_variable cv_;int count_; };int main() {Semaphore semaphore(0); // 创建一个初始计数为3的信号量std::thread t1([semaphore]() {semaphore.wait();std::cout Thread 1 is running. std::endl;});std::thread t2([semaphore]() {semaphore.wait();std::cout Thread 2 is running. std::endl;});semaphore.notify(); // 释放一个许可std::this_thread::sleep_for(std::chrono::seconds(1));std::cout 让主线程等待一会儿... std::endl;semaphore.notify(); // 释放一个许可t1.join();t2.join();return 0; }3.信号量例程二 运行 代码 #include condition_variable #include iostream #include mutex #include threadclass Semaphore {public:Semaphore(int count 0) : count_(count) {}void notify() {std::unique_lockstd::mutex lock(mutex_);count_;cv_.notify_one();}void wait() {std::unique_lockstd::mutex lock(mutex_);while (count_ 0) {cv_.wait(lock);}count_--;}private:std::mutex mutex_;std::condition_variable cv_;int count_; };Semaphore sem(0); // 创建一个初始计数为0的信号量void worker(int id) {std::cout Thread id is waiting. std::endl;sem.wait();std::cout Thread id has acquired the semaphore. std::endl;// 这里可以执行需要互斥访问的代码 }int main() {std::thread t1(worker, 1);std::thread t2(worker, 2);std::this_thread::sleep_for(std::chrono::seconds(2)); // 让主线程等待一会儿std::cout Main thread is notifying the semaphore. std::endl;sem.notify(); // 释放一个许可t1.join();t2.join();return 0; }4.信号量例程三 这个示例模拟了一个生产者-消费者问题其中多个生产者线程和消费者线程共享一个有界缓冲区信号量用于控制对缓冲区的并发访问。 在此示例中有三个生产者线程和三个消费者线程它们共享一个有界缓冲区。Semaphore类用于控制缓冲区的空闲和满状态。生产者线程生成随机项目并将它们放入缓冲区然后通知消费者线程。消费者线程从缓冲区中取出项目并通知生产者线程。信号量确保缓冲区在多线程环境中得到正确的访问和同步。 这个示例有助于理解信号量在多线程环境中的应用尤其是在生产者-消费者问题中的作用。通过信号量可以控制多个线程之间的并发访问以避免数据竞态和确保正确的协调。 运行 代码 #include condition_variable #include iostream #include mutex #include queue #include thread #include vectorconst int BUFFER_SIZE 5;class Semaphore {public:Semaphore(int count 0) : count_(count) {}void notify() {std::unique_lockstd::mutex lock(mutex_);count_;cv_.notify_one();}void wait() {std::unique_lockstd::mutex lock(mutex_);while (count_ 0) {cv_.wait(lock);}count_--;}private:std::mutex mutex_;std::condition_variable cv_;int count_; };Semaphore empty(BUFFER_SIZE); // 空缓冲区的信号量 Semaphore full(0); // 满缓冲区的信号量 std::mutex bufferMutex; // 缓冲区互斥量 std::queueint buffer; // 共享缓冲区void producer(int id) {for (int i 0; i 10; i) {int item rand() % 100; // 随机生成一个项目empty.wait(); // 等待空缓冲区bufferMutex.lock(); // 锁定缓冲区buffer.push(item); // 将项目放入缓冲区std::cout Producer id produced: item std::endl;bufferMutex.unlock(); // 解锁缓冲区full.notify(); // 通知缓冲区已满std::this_thread::sleep_for(std::chrono::milliseconds(100));} }void consumer(int id) {for (int i 0; i 10; i) {full.wait(); // 等待满缓冲区bufferMutex.lock(); // 锁定缓冲区int item buffer.front();buffer.pop();std::cout Consumer id consumed: item std::endl;bufferMutex.unlock(); // 解锁缓冲区empty.notify(); // 通知缓冲区已空std::this_thread::sleep_for(std::chrono::milliseconds(250));} }int main() {std::vectorstd::thread producers;std::vectorstd::thread consumers;for (int i 0; i 3; i) {producers.emplace_back(producer, i);consumers.emplace_back(consumer, i);}for (auto producerThread : producers) {producerThread.join();}for (auto consumerThread : consumers) {consumerThread.join();}return 0; }5.互斥量 6.PV操作概念 C中的PV操作通常是指与线程同步和互斥相关的操作用于实现信号量机制。PV操作通常是Semaphore信号量的操作用于控制多个线程对共享资源的访问。PV操作包括两个主要操作 P操作等待操作也称为down操作用于获取信号量并在信号量的值减一之前阻塞线程如果信号量的值已经为0则线程将被阻塞。P操作通常用于锁定临界区以防止多个线程同时访问共享资源。 在C中可以使用std::mutex或std::unique_lock来实现P操作也可以使用std::condition_variable来等待信号量的值达到某个条件。 std::mutex mtx; std::unique_lockstd::mutex lock(mtx);// 执行P操作等待互斥锁 lock.lock(); // 访问共享资源 // ... lock.unlock();V操作释放操作也称为up操作用于释放信号量并在信号量的值加一后唤醒一个或多个等待线程。V操作通常用于解锁临界区以允许其他线程访问共享资源。 在C中可以使用std::mutex、std::unique_lock或std::condition_variable来实现V操作。 std::mutex mtx; std::unique_lockstd::mutex lock(mtx);// 执行V操作释放互斥锁 lock.unlock(); // ...请注意C标准库还提供了一些高级的同步原语如std::mutex、std::condition_variable和std::atomic可以用于更灵活和安全地进行线程同步操作。此外C11之后引入的标准库还提供了std::thread来创建和管理线程以及std::atomic用于原子操作这些功能有助于更容易地编写多线程应用程序。 7.PV操作详解——抄自https://mp.weixin.qq.com/s/vvjhbzsWQNRkU7-b_dURlQ 8.PV操作的英文全称 PV操作中P和V通常代表以下内容的缩写 PP表示Produce生产或Post提交。在某些上下文中它表示请求或者申请资源的操作。在信号量Semaphore和互斥锁Mutex等并发编程中P操作通常用于请求资源或者进入临界区。 VV表示Vaporize释放或Vacate撤销。在某些上下文中它表示释放或者归还资源的操作。在并发编程中V操作通常用于释放资源或者退出临界区。 这些缩写通常用于描述在并发编程中使用的信号量、互斥锁或其他同步机制中的两种基本操作用于管理对共享资源的访问。不同的文献和编程环境可能会使用不同的术语来表示这些操作但P和V是比较常见的缩写。
http://www.sadfv.cn/news/162913/

相关文章:

  • 宿迁网站建设SEO优化营销企业安全文化建设导则最新版
  • 企业建设网站没有服务器首页定制
  • 网站降权不更新文章可以吗网站改版方案
  • 做高端网站公司网站从哪些方面来做
  • 婚庆公司包含哪些项目网站建设优化及推广
  • php网站接入支付宝wordpress添加广告位
  • html5大气网站企业网站建设大概多少钱
  • 石家庄个人建站网站策划360官网
  • 江夏区建设局网站网站排名站长之家
  • 外国做图网站如何免费制作手机app
  • 有什么办法做自己的网站如何制作网站视频
  • 网站源码程序修改卓成建设集团有限公司网站
  • 网站开发和网页上传的说法哈尔滨最新信息
  • 自己做众筹网站西安网站排名优化
  • 童装网站建设乐山电商网站开发
  • 网站建设上qq图标去除建设购物网站的方案
  • 网站前端与后台必须同时做吗鞍山便民信息平台
  • 上海网站建设海淘科技节庆时候的网站是怎么做的
  • 域名申请好怎么做网站wordpress100万数据
  • 建设银行的网站为什么登不上个人网站的建设流程
  • 做电脑网站手机能显示不出来怎么办wordpress 七牛 上传
  • 中国商检局做备案网站网页制作的公司选时代创信
  • 文具网站建设合同书唐山自助建站模板
  • 浙江门户网站建设公司中国 网站服务器 租金
  • 建站技巧wordpress更换网站
  • 济宁 网站建设哪个网站做员工增员
  • 学历网站怎么做怎么建设网站运城
  • 手机网站优化技巧建设公司和建筑公司哪个好
  • wordpress dede搜索引擎优化排名seo
  • 网站建设及维护合同网站开发项目管理文档