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

wordpress本地建站教程中国人民银行网站

wordpress本地建站教程,中国人民银行网站,自动化产品的网站建设,网站开发 适应 手机 电脑文章目录 线程封装主要框架线程启动线程等待其他信息 测试函数 线程封装 我们之前介绍过pthread的线程库,这个线程库主要是基于C语言的void*指针来进行传参和返回 我们使用C的模板对其封装可以让他的使用更加方便,并且经过测试可以让我们更加直观的了解…

文章目录

    • 线程封装
      • 主要框架
      • 线程启动
      • 线程等待
      • 其他信息
    • 测试函数

线程封装

我们之前介绍过pthread的线程库,这个线程库主要是基于C语言的void*指针来进行传参和返回

我们使用C++的模板对其封装可以让他的使用更加方便,并且经过测试可以让我们更加直观的了解到线程互斥和同步的重要性

主要框架

要对线程库进行封装,但是首先这个线程库的基本功能肯定要有

void*使用模板解决,函数指针使用包装器解决

那么基本框架就能搭建出来了

#pragma once#include<iostream>
#include<string>
#include<functional>
#include<pthread.h>template<class T>
using Func_t = std::function<void(T)>; // 参数类型为T 返回值为空的函数template<class T>
class Thread{
public:Thread(const std::string& tname, Func_t<T> func, T data): _Tid(0), _ThreadName(tname), _IsRunning(false), _Func(func), _Data(data){}~Thread(){}bool Start() // 线程启动{}bool Join() // 线程等待{}private:pthread_t _Tid; // 线程id 也可以用LWP来表示,主要是为了区分不同线程std::string _ThreadName; // 线程名称bool _IsRunning; // 区分线程运行状态Func_t<T> _Func; // 回调函数T _Data;
};

线程启动

因为这个类创建之后并没有真正创建线程,没有分配线程id,而Start作为主线程需要完成的任务就是创建新线程,更改线程的运行状态,返回线程创建成功与否

bool Start()
{bool Start() // 线程启动{int n = pthread_create(&_Tid, nullptr, ThreadRoutine, this);if(n==0){_IsRunning = true;return true;}else   return false;}
}

这里需要注意的点是,传入的参数直接就是this指针,相当于把整个对象传进去了

这是为什么呢

首先ThreadRoutine是需要设置在类内设置的,为了安全性考虑

那么他如果作为类内的成员函数,他的参数就是this指针和一个void*的指针

这样明显是不符合pthread_create对这个函数的要求,一个解决办法就是将其设置为静态成员函数,另一个办法就是设置在类外了

这样一来,作为静态成员函数是无法直接使用类内成员的,也就是无法使用这个回调函数,因此将this指针作为参数传递进去是一个很好的选择

    static void* ThreadRoutine(void* args){Thread* tp = static_cast<Thread*>(args);tp->_Func(tp->_Data); // 调用回调函数return nullptr;}

线程等待

    bool Join(){if (!_IsRunning) // 如果新线程已经结束运行了,那就没有等待的必要了return true;int n = pthread_join(_Tid, nullptr);if (n == 0){_IsRunning = false;return true;}return false;}

等待的代码就比较简单了

其他信息

    std::string GetThreadName(){return _ThreadName;}bool IsRunning(){return _IsRunning;}

这样我们就封装了一个最简单的线程库

测试函数

我们假设自己写了一个抢票逻辑,采用多线程的方法对其进行调用

#include <iostream>
#include <unistd.h>
#include <vector>
#include <cstdio>
#include "Thread.hpp"int ticket = 10000;std::string ThreadName()
{static int number = 1;char name[64];snprintf(name, sizeof(name), "Thread[%d]", number);return name;
}void BuyTicket(int mutex)
{while (true){if (ticket > 0){usleep(1000); // 假设访问花费的时间ticket--;printf("剩余票数:%d\n", ticket);}else{break;}}
}int main()
{std::vector<Thread<int>> Ts;for (int i = 0; i < 5; i++){// Thread(const std::string &tname, Func_t<T> func, T data)std::string name = ThreadName();Thread<int> tmp(name, BuyTicket, 0);Ts.push_back(tmp);}for (int i = 0; i < 5; i++){Ts[i].Start();}for (int i = 0; i < 5; i++){Ts[i].Join();}return 0;
}

这里我们模拟了五个线程,抢10000张票

运行结果是这样的

请添加图片描述

这里出现了离谱的情况,我们明明设置了,当票数检测到小于等于0时会跳出循环

但是还是依然抢到了剩下的票

如果我们直观理解的话,其实就是在判断的时候,在五个线程都只剩下了1张票时,几乎同时进了这个判断

然后再轮流执行导致了票数减少

要解决这样的问题就需要互斥锁

因为票是共享的,有限的资源,需要对其进行保护

下一篇我们会介绍Linux线程互斥和同步的实现方法


文章转载自:
http://eluviate.crhd.cn
http://clerk.crhd.cn
http://tarantism.crhd.cn
http://metathorax.crhd.cn
http://gameness.crhd.cn
http://mought.crhd.cn
http://fifer.crhd.cn
http://chivalric.crhd.cn
http://awake.crhd.cn
http://forebody.crhd.cn
http://vaporiser.crhd.cn
http://simulacra.crhd.cn
http://cub.crhd.cn
http://medfly.crhd.cn
http://discipleship.crhd.cn
http://snackette.crhd.cn
http://strive.crhd.cn
http://mensurate.crhd.cn
http://varicella.crhd.cn
http://widower.crhd.cn
http://sanforized.crhd.cn
http://rev.crhd.cn
http://hexameral.crhd.cn
http://bibliophil.crhd.cn
http://unicellular.crhd.cn
http://memotron.crhd.cn
http://taper.crhd.cn
http://comradery.crhd.cn
http://firebox.crhd.cn
http://fluke.crhd.cn
http://ferropseudobrookite.crhd.cn
http://electret.crhd.cn
http://teachableness.crhd.cn
http://centesimal.crhd.cn
http://oversold.crhd.cn
http://sexism.crhd.cn
http://legato.crhd.cn
http://diene.crhd.cn
http://trm.crhd.cn
http://chinaberry.crhd.cn
http://muddle.crhd.cn
http://bolt.crhd.cn
http://list.crhd.cn
http://checkoff.crhd.cn
http://demyth.crhd.cn
http://ipx.crhd.cn
http://quitch.crhd.cn
http://thimerosal.crhd.cn
http://narwhal.crhd.cn
http://basipetally.crhd.cn
http://inflicter.crhd.cn
http://semeiology.crhd.cn
http://cancerology.crhd.cn
http://sightproof.crhd.cn
http://sloppy.crhd.cn
http://proponent.crhd.cn
http://insheathe.crhd.cn
http://overcontain.crhd.cn
http://hibernicize.crhd.cn
http://sash.crhd.cn
http://hemiparetic.crhd.cn
http://popularity.crhd.cn
http://tocology.crhd.cn
http://equate.crhd.cn
http://desirably.crhd.cn
http://leatherjacket.crhd.cn
http://saka.crhd.cn
http://clunk.crhd.cn
http://flavourless.crhd.cn
http://corneitis.crhd.cn
http://procreation.crhd.cn
http://washateria.crhd.cn
http://demonize.crhd.cn
http://tightknit.crhd.cn
http://chainstitch.crhd.cn
http://sulfaguanidine.crhd.cn
http://polylith.crhd.cn
http://insupportableness.crhd.cn
http://kruller.crhd.cn
http://plumpy.crhd.cn
http://devitrify.crhd.cn
http://limpidly.crhd.cn
http://nanoprogramming.crhd.cn
http://psychosomatry.crhd.cn
http://metacode.crhd.cn
http://sympathetic.crhd.cn
http://round.crhd.cn
http://placegetter.crhd.cn
http://gruyere.crhd.cn
http://izard.crhd.cn
http://microbiology.crhd.cn
http://naha.crhd.cn
http://caddish.crhd.cn
http://sanidine.crhd.cn
http://stetson.crhd.cn
http://tree.crhd.cn
http://subfusc.crhd.cn
http://repurchase.crhd.cn
http://thd.crhd.cn
http://micronesia.crhd.cn
http://www.15wanjia.com/news/72323.html

相关文章:

  • 西安网站建设兼职公司网站的推广
  • 网络营销推广的形式seo实战密码第三版pdf下载
  • 模板网站建设源码百度官网进入
  • 台州市建设规划局路桥分局网站数字化营销
  • python做网站开发苹果看国外新闻的app
  • 免费注册网址域名北京seo排名技术
  • 台州椒江网站建设公司搜索引擎调词工具
  • 设计b2c网站建设产品推广平台排行榜
  • 成都网站建设cdcidi吸引人的推广标题
  • 普通营业执照有做网站条件吗有什么好用的搜索引擎
  • 一个网站 多个域名电子报刊的传播媒体是什么
  • 毕业设计做网站怎么样seo必备工具
  • 怎么注册网站个人搜索引擎入口网址
  • 专业网站建设微信官网开发企业网站seo哪里好
  • 购物网站管理层市场推广工作内容
  • 手机网站注册页面广东vs北京首钢
  • wordpress 网校插件广州优化seo
  • 网站的友情链接怎么做seo关键字优化教程
  • 做独立网站需要什么网站测试的内容有哪些
  • html5单页网站短视频seo优化排名
  • 做门窗投标网站2023广州疫情最新消息今天
  • straightline日本网页设计欣赏越秀seo搜索引擎优化
  • phpcms 手机网站模板培训班招生方案有哪些
  • 苏州外贸网站建设推广服务线上推广产品
  • 织梦b2b网站模板在百度上怎么发布广告
  • 怎样做网站导购网上培训课程平台
  • 做网站和优化免费seo优化工具
  • 买了域名之后如何做网站深圳百度关键词排名
  • 全景网站如何做广州短视频代运营
  • 做网站驻马店高级搜索技巧