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

广东同江医院网站建设网站搭建兼职

广东同江医院网站建设,网站搭建兼职,招标网中标公示,瀑布流 主题 wordpress多线程的功能 线程是进程中的一个实体#xff0c;是被系统独立调度和分派的基本单位。一个进程可以拥有多个线程#xff0c;但是一个线程必须有一个进程。线程自己不拥有系统资源#xff0c;只有运行所必须的一些数据结构#xff0c;但它可以与同属于一个进程的其它线程共…多线程的功能 线程是进程中的一个实体是被系统独立调度和分派的基本单位。一个进程可以拥有多个线程但是一个线程必须有一个进程。线程自己不拥有系统资源只有运行所必须的一些数据结构但它可以与同属于一个进程的其它线程共享进程所拥有的全部资源同一个进程中的多个线程可以并发执行。通过多线程地进行运算可以更充分地利用CPU资源。 在实践中多线程有一个不可或缺的功能。如在交互式应用程序中需要进行持续的数据处理操作并且实时监听用户的命令。如果单线程执行数据处理那么在数据处理结束之前程序是无法接收其他指令的。因此需要为数据处理单独建立一个线程。 CreateThread创建线程函数 参考博客在C/C中可以通过CreateThread函数在进程中创建线程函数的具体格式如下 HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadID);参数的含义如下 lpThreadAttrivutes指向SECURITY_ATTRIBUTES的指针用于定义新线程的安全属性一般设置成NULL dwStackSize分配以字节数表示的线程堆栈的大小默认值是0 lpStartAddress指向一个线程函数地址。每个线程都有自己的线程函数线程函数是线程具体的执行代码 lpParameter传递给线程函数的参数 dwCreationFlags表示创建线程的运行状态其中CREATE_SUSPEND表示挂起当前创建的线程而0表示立即执行当前创建的进程 lpThreadID返回新创建的线程的ID编号 如果函数调用成功则返回新线程的句柄 一个实例 //DataProcess.h #include Windows.h #include iostream class DataProcess { public:DataProcess(){m_nData 0;}~DataProcess(){}//开始数据处理void StartProcess(){m_hProcessThread CreateThread(NULL, 0, ProcessThreadFun, this, 0, m_dwThreadID);}//停止数据处理void StopProcess() {CloseHandle(m_hProcessThread);}static DWORD WINAPI ProcessThreadFun(LPVOID lpParam){if (lpParam ! NULL){DataProcess* DataProcessPtr (DataProcess*)lpParam;DataProcessPtr-ProcessData();}return 0;}//数据处理函数,会持续运行void ProcessData(){while (true){Sleep(100); //模拟数据处理的耗时m_nData;std::cout m_nData std::endl;}} private:HANDLE m_hProcessThread; //数据处理线程句柄int m_nData; //模拟线程处理的数据DWORD m_dwThreadID; //线程ID };//main.cpp #include Windows.h #include iostream #include DataProcess.hint main() {DataProcess *pProcessor new DataProcess();pProcessor-StartProcess();Sleep(2000); //模拟主线程同时进行其他工作pProcessor-StopProcess();return 0; }在这个例子中我们模拟了一个数据处理类DataProcess其功能为连续不断地处理数据。为它单独开辟了一个线程。可以看到在main函数中主线程Sleep(2000)并不影响在DataProcess中进行了20轮的数据处理操作。 std::mutex为线程加锁 参考博客。 std::mutex 是C11 中最基本的互斥量std::mutex 对象提供了独占所有权的特性——即不支持递归地对 std::mutex 对象上锁而 std::recursive_lock 则可以递归地对互斥量对象上锁。 std::mutex 的成员函数 构造函数std::mutex不允许拷贝构造也不允许 move 拷贝最初产生的 mutex 对象是处于 unlocked 状态的。lock()调用线程将锁住该互斥量。线程调用该函数会发生下面 3 种情况(1). 如果该互斥量当前没有被锁住则调用线程将该互斥量锁住直到调用 unlock之前该线程一直拥有该锁。(2). 如果当前互斥量被其他线程锁住则当前的调用线程被阻塞住。(3). 如果当前互斥量被当前调用线程锁住则会产生死锁(deadlock)。unlock() 解锁释放对互斥量的所有权。try_lock()尝试锁住互斥量如果互斥量被其他线程占有则当前线程也不会被阻塞。线程调用该函数也会出现下面 3 种情况(1). 如果当前互斥量没有被其他线程占有则该线程锁住互斥量直到该线程调用 unlock 释放互斥量。(2). 如果当前互斥量被其他线程锁住则当前调用线程返回 false而并不会被阻塞掉。(3). 如果当前互斥量被当前调用线程锁住则会产生死锁(deadlock)。 在之前的程序里测试一下mutex的效果: //main.cpp #include Windows.h #include iostream #include DataProcess.hint main() {DataProcess *pProcessor new DataProcess();pProcessor-StartProcess();Sleep(1000); //模拟主线程同时进行其他工作pProcessor-SetData(-200);Sleep(500);pProcessor-StopProcess();return 0; }//DataProcess.h #include Windows.h #include mutex #include iostream class DataProcess { public:DataProcess(){m_nData 0;}~DataProcess(){}//开始数据处理void StartProcess(){m_hProcessThread CreateThread(NULL, 0, ProcessThreadFun, this, 0, m_dwThreadID);}//停止数据处理void StopProcess() {CloseHandle(m_hProcessThread);}static DWORD WINAPI ProcessThreadFun(LPVOID lpParam){if (lpParam ! NULL){DataProcess* DataProcessPtr (DataProcess*)lpParam;DataProcessPtr-ProcessData();}return 0;}//数据处理函数,会持续运行void ProcessData(){while (true){m_ProcessMutex.lock();Sleep(100); //模拟数据处理的耗时m_nData;std::cout m_nData std::endl;m_ProcessMutex.unlock();}}void SetData(int nData){m_ProcessMutex.lock();this-m_nData nData;m_ProcessMutex.unlock();} private:HANDLE m_hProcessThread; //数据处理线程句柄int m_nData; //模拟线程处理的数据DWORD m_dwThreadID; //线程IDstd::mutex m_ProcessMutex; //数据处理操作互斥量 };![在这里插入图片描述](https://img-blog.csdnimg.cn/20200406113446631.pn添加链接描述 g?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xvZ2ljOTE2OQ,size_16,color_FFFFFF,t_70) p.s. 每次数据处理的操作时间并不是严格的100ms程序运行也需要一定的时间所以输出的数据并不是10个5个 std::thread 引自C11 并发指南一(C11 多线程初探) C11 新标准中引入了四个头文件来支持多线程编程他们分别是atomic ,thread,mutex,condition_variable和future。 atomic该头文主要声明了两个类, std::atomic 和 std::atomic_flag另外还声明了一套 C 风格的原子类型和与 C 兼容的原子操作的函数。thread该头文件主要声明了 std::thread 类另外 std::this_thread 命名空间也在该头文件中。mutex该头文件主要声明了与互斥量(mutex)相关的类包括 std::mutex 系列类std::lock_guard, std::unique_lock, 以及其他的类型和函数。condition_variable该头文件主要声明了与条件变量相关的类包括 std::condition_variable 和 std::condition_variable_any。future该头文件主要声明了 std::promise, std::package_task 两个 Provider 类以及 std::future 和 std::shared_future 两个 Future 类另外还有一些与之相关的类型和函数std::async() 函数就声明在此头文件中。 thread的简单应用 下面是一个简单的std::thread的例子 //main.cpp #include Windows.h #include iostream #include threadvoid f1() {int i;for (i 0; i 5; i){std::cout i std::endl;Sleep(500);} }int main() {std::thread t(f1); //用函数f1构造线程。不需要传递参数t.join();return 0; }函数参数可以在thread的构造函数中传入如下所示 //main.cpp #include Windows.h #include iostream #include threadstd::mutex m; //全局互斥量mutex控制进行连续的输出操作void f1() {int i;for (i 0; i 5; i){m.lock();std::cout i std::endl;m.unlock();Sleep(500);} }void f3(int n1, int n2) {int i;for (i 0; i 5; i){m.lock();std::cout n1 n2 i std::endl;m.unlock();Sleep(200);} }int main() {std::thread t1(f1); //用函数f1构造线程。不需要传递参数std::thread t3(f3, 5, 7); //用函数f3构造线程传递函数所需的两个参数t1.join(); //t1线程开始运行t3.join(); //t3线程开始运行return 0; }类中的使用 c11没有线程强制退出的接口所以只能自己实现退出逻辑。博客提供了一种实现。 这种实现方法涉及c11的atomic类 头文件原子类型是封装了一个值的类型它的访问保证不会导致数据的竞争并且可以用于在不同的线程之间同步内存访问。 使用atomic可以实现控制线程函数的进行或结束。 线程函数通过while循环来持续运行。while循环为真的条件中加入atomic标志位即可实现在线程函数之外控制线程的持续与否。 这里是引用 joinjoin的作用是让主线程等待直到该子线程执行结束 detach: Detach 线程。 将当前线程对象所代表的执行实例与该线程对象分离使得线程的执行可以单独进行。一旦线程执行完毕它所分配的资源将会被释放。 join()和detach()的区别在于join()等待子线程执行完后再继续主线程。而detach()使得子线程可以单独执行不影响主线程的继续执行。这种做法存在风险因为主线程执行完毕后thread对象析构就失去了对于线程的控制。程序员需要自行控制子线程何时终止。 下面提供了一个实例 //DataProcessor.h #pragma once #include Windows.h #include thread #include mutex #include atomic using namespace std;class DataProcessor { public:DataProcessor() {m_bWorking false;m_nData 0;}~DataProcessor() {}//开始数据处理void StartProcess();//停止数据处理void StopProcess();//数据处理函数,会持续运行void ProcessData();void SetData(int nData);private:int m_nData; //模拟线程处理的数据thread m_tProcessThread; //数据处理线程atomicbool m_bWorking; //指示函数是否继续运行std::mutex m_ProcessMutex; //数据处理操作互斥量 };//DataProcessor.cpp #include DataProcessor.h #include functional #include iostreamvoid DataProcessor::StartProcess() {m_bWorking true;m_tProcessThread thread(bind(DataProcessor::ProcessData, this)); //绑定线程函数m_tProcessThread.detach(); //和线程对象分离的这样线程可以独立地执行 }void DataProcessor::StopProcess() {m_bWorking false; //指示ProcessData()函数退出循环 }void DataProcessor::ProcessData() {while (m_bWorking){m_ProcessMutex.lock();Sleep(100); //模拟数据处理的耗时m_nData;std::cout processing m_nData std::endl;m_ProcessMutex.unlock();} }void DataProcessor::SetData(int nData) {m_ProcessMutex.lock();this-m_nData nData;m_ProcessMutex.unlock(); }int main() {DataProcessor *pProcessor new DataProcessor();pProcessor-StartProcess();Sleep(1000); //模拟主线程同时进行其他工作pProcessor-SetData(-200);Sleep(500);pProcessor-StopProcess();system(pause);return 0; }
http://www.hkea.cn/news/14276844/

相关文章:

  • 学校网站建设 论文呢源码编程器手机版下载
  • .net网站开发 平台怎样推广品牌
  • 五个网站网络舆情现状分析
  • 网站建设交流论坛地址网页布局设计器
  • 服装设计网南宁网络优化seo费用
  • 哪里有培训网站开发做网站怎么给客户打电话
  • 有什么网站是做企业型的360首页
  • 清新区城乡建设局网站广州网站优化实战
  • 网站模板免费吗公司网站建设合同模板下载
  • 网站编辑器做网站备案什么意思
  • 网上做兼职网站正规商丘网站建设推广渠道
  • 国外金融网站设计欣赏seo优化排名易下拉试验
  • 维护公司网站建设开发网站公司推荐
  • 百度推广就是做网站吧网站前台模板怎么替换
  • 网站开发参数wordpress评测
  • 网站怎么做外链接怎么建设一个自己的网站
  • 如何快速用手机做网站wordpress 删除修订版本
  • 网站设计书籍哈尔滨城乡建设厅网站
  • 网站管理建设总结网站建设归哪个部门
  • 北京建设局网站首页制作公司主页
  • 网站优化流程图众筹网站怎么做
  • 网站怎么做uc整合字牌标识公司网站网站编号 6019
  • 做黏土的网站网站制作知名公司
  • 网站如何建设与安全那有名网站是php做的
  • 天津武清网站开发阿里云域名注册官网
  • 用DW做网站时怎么在新窗口打开做企业网站需要建多大的画布
  • 重庆网站制作系统前端培训多少钱
  • 前端搜索网站引擎怎么做平台式建站
  • 天台县低价网站建设电子商务网站建设原则
  • 电子商务网站建设与实践重庆市建设网站