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

河南做网站找谁推广方案有哪些

河南做网站找谁,推广方案有哪些,买公司的网站建设,网站服务器查找目录 ​编辑 一,线程的创建 二,线程的退出 1,在子线程内return 2,使用pthread_exit(void*) 三,线程等待 四,线程获取自己的id值 五,线程取消 六,线程分离 一,线程的创建 在对…

目录

​编辑

一,线程的创建

二,线程的退出

1,在子线程内return

 2,使用pthread_exit(void*)

三,线程等待

四,线程获取自己的id值

五,线程取消

六,线程分离


一,线程的创建

在对进程控制之前,首先要做的便是创建一个线程。创建方法如下:

使用的创建方法叫做pthread_create。

参数介绍:

thread:线程id
attr:线程属性,直接设为null
start_routine:函数指针
arg:这个参数会传递进start_routinevoid*参数中。

例子:

 #include<iostream>#include<pthread.h>#include<unistd.h>using namespace std;void* hander(void* args)//新线程执行的方法{while(true){sleep(1);cout << "i am new thread" << endl;}}int main(){pthread_t td;pthread_create(&td, nullptr, hander, nullptr);//创建好新线程以后,新线程会去执行传入的hander方法。while(true)//主线程会继续向下执行自己的方法{sleep(1);cout << "i am main thread" << endl;}return 0;}

 执行这个代码以后结果如下:

在这里要注意,在使用g++编译时要加上-lpthread。因为线程库是一个第三方库,但是是安装在系统中的所以只需要-l便可以连接到pthread库

二,线程的退出

1,在子线程内return

  线程的退出有多种方式,先来看看最基本的一种退出方式,代码如下:

​
void *hander(void *args)
{string name = static_cast<const char *>(args);int cnt = 5;while (cnt--){cout << "i am new thread" << name << endl;sleep(1);}return nullptr;//最基本的退出线程的方式便是直接在子线程内部使用return的方式退出
}class data
{
public:char buf[64];int i;
};int main()
{for (int i = 1; i <= NUM; i++) // 创建一批线程{data *m = new data();snprintf(m->buf, sizeof(m->buf), "%s:%d", "new thread", i);pthread_t td;pthread_create(&td, nullptr, hander, (void *)m->buf);}while (true){cout << "-- -- -- -- -- -- -- --sucess -- -- -- -- -- -- -- " << endl;sleep(1);}return 0;
}​

 在使用这种方式退出时,主线程在子线程退出以后还会继续执行。但是如果是子线程不退出而主线程先退出呢?像这样:

​
void *hander(void *args)
{string name = static_cast<const char *>(args);int cnt = 5;while (true)//子线程一直在死循环{cout << "i am new thread" << name << endl;sleep(1);}return nullptr;
}class data
{
public:char buf[64];int i;
};int main()
{for (int i = 1; i <= NUM; i++) // 创建一批线程{data *m = new data();snprintf(m->buf, sizeof(m->buf), "%s:%d", "new thread", i);pthread_t td;pthread_create(&td, nullptr, hander, (void *)m->buf);}int cnt = 5;while (cnt--)//主线程在cnt减到零时就退出{cout << "-- -- -- -- -- -- -- --sucess -- -- -- -- -- -- -- " << endl;sleep(1);}return 0;
}​

 这样的话只要主线程退出了,这个进程都会直接结束。 如下:

 2,使用pthread_exit(void*)

这个函数是线程库提供给我们的专门用于线程退出的函数,他的参数可以直接设置为nullptr。使用方式如下:

void *hander(void *args)
{string name = static_cast<const char *>(args);int cnt = 5;while (cnt--){cout << "i am new thread" << name << endl;sleep(1);}pthread_exit(nullptr);//使用pthread_exit()退出线程。
}class data
{
public:char buf[64];int i;
};int main()
{for (int i = 1; i <= NUM; i++) // 创建一批线程{data *m = new data();snprintf(m->buf, sizeof(m->buf), "%s:%d", "new thread", i);pthread_t td;pthread_create(&td, nullptr, hander, (void *)m->buf);}while (true){cout << "-- -- -- -- -- -- -- --sucess -- -- -- -- -- -- -- " << endl;sleep(1);}return 0;
}

使用pthread_exit退出的效果和在子线程内使用return退出的效果一样。 

 ##注意##  线程的退出不能使用exit,因为exit的本质其实是向进程发信号,所以exit是专门用于进程退出的。同样的,线程的退出也不需要返回errno,因为如果一个线程因为异常退出的话整个进程都会退出,进程返回errno就可以了。

三,线程等待

和进程一样,线程也需要等待。等待的目的如下:

1,回收新线程对应的内核资源。

2,接收新线程返回的数据。

线程等待函数: int pthread_join(pthread_t thread, void **retval)

thread:表示要等待线程的pid

reval:接收数据并将数据带出。

使用如下:

class thread
{
public:int _num;       // 线程的编号char _buf[64];  // 线程的名字pthread_t _tid; // 线程的id
};void *start_routine(void *args)
{int cnt = 5;while (cnt--){sleep(1);thread *_td = static_cast<thread *>(args);cout << "i am new thread:" << _td->_buf << ":" << _td->_num<< ":" << _td->_tid << endl;}pthread_exit(nullptr);//线程退出
}int main()
{vector<thread*> threads;for (int i = 1; i <= 10; i++)//创建线程{thread *td = new thread;td->_num = i;snprintf(td->_buf, sizeof(td->_buf), "%s-%d", "thread:", i);pthread_create(&td->_tid, nullptr, start_routine, (void *)td);threads.push_back(td);}for(auto e:threads){void *ret = nullptr;pthread_join(e->_tid, &ret);//回收线程cout << "等待成功"<< " tid:" << e->_tid << endl;}cout << "等待结束" << endl;return 0;
}

以上的代码便演示了如何用pthread_join进行线程的等待效果如下:

那该函数里面的里面的返回值有什么作用呢?其实这个返回值就是用来带出退出码的。过程如下:

 添加打印退出码的信息以后结果如下:

那为什么reval的类型是二级指针类型呢?这其实是因为线程结束后,退出信息会写入到线程库内部。线程库内部的退出码便是void*类型的。此时我们要想的便是获取这个退出码了,如何获取呢?因为pthread_join()的返回值是int类型的,所以我们便不能直接让pthread_join()直接返回一个void*类型的变量,所以只能自己在用户层定义一个void*类型的retval然后retval的地址传入进去获取返回值了。

四,线程获取自己的id值

使用 pthread_t pthread_self(void)可以获取到当前线程的id值。

示例代码:

#include <iostream>
#include <pthread.h>
#include <vector>
#include <unistd.h>
using namespace std;void *Done(void *args)
{uint64_t i = (uint64_t)args;string name = "thread_" + to_string(i);sleep(1);cout << name << "id :" << pthread_self() << endl;//使用pthread_self()打印线程id值。}int main()
{vector<pthread_t> wait;for (uint64_t i = 1; i <= 4; i++){pthread_t td;pthread_create(&td, nullptr, Done, (void *)i); // 创建线程wait.push_back(td);sleep(2);}for (auto e : wait) // 等待线程{pthread_join(e, nullptr);}return 0;
}

 

如果用16进制打印便是下面这样的: 

其实线程的id就是一些地址。

五,线程取消

 进行线程取消的函数叫做pthread_cancel(pthread_t thread)。线程取消的前提是线程先运行起来,然后才能取消。

实验代码:创建线程,然后取消一半线程,观察现象。

class thread
{
public:int _num;       // 线程的编号char _buf[64];  // 线程的名字pthread_t _tid; // 线程的id
};void *start_routine(void *args)
{int cnt = 5;while (cnt--){sleep(1);thread *_td = static_cast<thread *>(args);cout << "i am new thread:" << _td->_buf << ":" << _td->_num<< ":" << _td->_tid << endl;}pthread_exit((void*)100);
}int main()
{vector<thread *> threads;for (int i = 1; i <= 10; i++){thread *td = new thread;td->_num = i;snprintf(td->_buf, sizeof(td->_buf), "%s-%d", "thread:", i);pthread_create(&td->_tid, nullptr, start_routine, (void *)td->_buf);threads.push_back(td);}for (int i = 0;i<threads.size()/2;i++)//取消一半的线程{pthread_cancel(threads[i]->_tid);}for (auto e : threads)//等待{void *ret = nullptr;pthread_join(e->_tid, &ret);cout << "等待成功"<< " tid:" << e->_tid << "quit code: " << (long long)(ret) << endl;delete e;}cout << "等待结束" << endl;return 0;
}

 运行结果如下:

可以看到如果取消线程,那线程还是会被等待然后退出,退出码是-1。其实这是一个宏:

六,线程分离

        线程分离使用到的函数 int pthread_detach(pthread_t thread)。先来说明一下,新创建的线程默认是joinable的。但是如果我的主线程并不关心当前的线程的返回值,那当前的线程便与我无关。那我的主线程去等待当前的线程便对我的主线程是一种负担。这个时候便可以来进行线程分离。线程的分离方式有两种:1,主线程去分离子线程    2,子线程自己进行分离。

示例代码:

1,主线程进行分离

#include<iostream>
#include<pthread.h>
#include<vector>
#include<unistd.h>
using namespace std;void* Done(void* args)
{uint64_t i = (uint64_t)args;string name = "thread_" + to_string(i);int cnt = 5;while (cnt--){sleep(1);cout << name << "running....." << endl;sleep(3);}
}int main()
{vector<pthread_t> wait;for (uint64_t i = 1; i <= 4; i++){pthread_t td;pthread_create(&td, nullptr, Done, (void*)i);//创建线程wait.push_back(td);sleep(3);//先休眠三秒,再进行线程分离pthread_detach(td);//主线程子集分离}for(auto e:wait)//等待线程{int n =  pthread_join(e,nullptr);cout << n << " " << endl;//打印等待的返回值,0表示成功,其它表示失败。}return 0;
}

2,子线程自己主动分离 

#include <iostream>
#include <pthread.h>
#include <vector>
#include <unistd.h>
using namespace std;void *Done(void *args)
{uint64_t i = (uint64_t)args;string name = "thread_" + to_string(i);pthread_detach(pthread_self()); // 子线程自己自动分离int cnt = 5;while (cnt--){cout << name << "running....." << endl;sleep(1);}
}int main()
{vector<pthread_t> wait;for (uint64_t i = 1; i <= 4; i++){pthread_t td;pthread_create(&td, nullptr, Done, (void *)i); // 创建线程wait.push_back(td);}for (auto e : wait) // 等待线程{int n = pthread_join(e, nullptr);cout << n << " " << endl; // 打印等待的返回值,0表示成功,其它表示失败。}return 0;
}

  

 


文章转载自:
http://forejudge.nrpp.cn
http://hotness.nrpp.cn
http://sycophant.nrpp.cn
http://hebe.nrpp.cn
http://freezer.nrpp.cn
http://oyer.nrpp.cn
http://ush.nrpp.cn
http://undecagon.nrpp.cn
http://riverly.nrpp.cn
http://animus.nrpp.cn
http://hebraise.nrpp.cn
http://mano.nrpp.cn
http://celature.nrpp.cn
http://megaripple.nrpp.cn
http://kidnapper.nrpp.cn
http://thespis.nrpp.cn
http://disastrous.nrpp.cn
http://garuda.nrpp.cn
http://calamint.nrpp.cn
http://indisposition.nrpp.cn
http://antihistaminic.nrpp.cn
http://antiphrasis.nrpp.cn
http://jolliness.nrpp.cn
http://salvarsan.nrpp.cn
http://reune.nrpp.cn
http://orderliness.nrpp.cn
http://lithopone.nrpp.cn
http://stake.nrpp.cn
http://hysterotely.nrpp.cn
http://resistojet.nrpp.cn
http://crossbreed.nrpp.cn
http://vasotonic.nrpp.cn
http://snippy.nrpp.cn
http://histiocyte.nrpp.cn
http://same.nrpp.cn
http://structural.nrpp.cn
http://thumbscrew.nrpp.cn
http://systole.nrpp.cn
http://desalination.nrpp.cn
http://wringer.nrpp.cn
http://hewer.nrpp.cn
http://chestnut.nrpp.cn
http://temporizer.nrpp.cn
http://sophist.nrpp.cn
http://tungstic.nrpp.cn
http://pvc.nrpp.cn
http://ploughing.nrpp.cn
http://cytokinin.nrpp.cn
http://dulcinea.nrpp.cn
http://adversity.nrpp.cn
http://scout.nrpp.cn
http://culturette.nrpp.cn
http://pyrosis.nrpp.cn
http://dungeon.nrpp.cn
http://diaphone.nrpp.cn
http://soubresaut.nrpp.cn
http://vitellus.nrpp.cn
http://empyema.nrpp.cn
http://foumart.nrpp.cn
http://victimology.nrpp.cn
http://irishize.nrpp.cn
http://edentate.nrpp.cn
http://balneation.nrpp.cn
http://petition.nrpp.cn
http://heptad.nrpp.cn
http://transoid.nrpp.cn
http://postulator.nrpp.cn
http://clementina.nrpp.cn
http://galeeny.nrpp.cn
http://cuatro.nrpp.cn
http://intricately.nrpp.cn
http://tipster.nrpp.cn
http://ittf.nrpp.cn
http://croaky.nrpp.cn
http://jct.nrpp.cn
http://criminatory.nrpp.cn
http://diabetogenic.nrpp.cn
http://raca.nrpp.cn
http://ewan.nrpp.cn
http://terrified.nrpp.cn
http://ovate.nrpp.cn
http://lancastrian.nrpp.cn
http://rockling.nrpp.cn
http://ankus.nrpp.cn
http://oversupply.nrpp.cn
http://engulf.nrpp.cn
http://solutizer.nrpp.cn
http://overpass.nrpp.cn
http://gourdshaped.nrpp.cn
http://acini.nrpp.cn
http://jessamin.nrpp.cn
http://physically.nrpp.cn
http://bullhorn.nrpp.cn
http://separative.nrpp.cn
http://bazaar.nrpp.cn
http://longheaded.nrpp.cn
http://exclusion.nrpp.cn
http://volcanist.nrpp.cn
http://icftu.nrpp.cn
http://lacker.nrpp.cn
http://www.dt0577.cn/news/98823.html

相关文章:

  • 江苏省网架公司引擎搜索优化
  • 想做网站的公司浏览器下载安装2022最新版
  • 模板建网站哪个品牌好河北网站优化公司
  • 技术支持 英铭网站建设广州seo营销培训
  • 网站建设好公司哪家好百度一下就知道首页
  • 长白山网站学做管理找网络公司做推广费用
  • 做网站有兼职的吗千锋教育北京校区
  • 恶搞网站链接怎么做网络营销人员招聘
  • 南宁免费建站模板站长之家站长工具综合查询
  • 哪个视频网站做视频赚钱seo整站优化外包
  • wordpress 手机模板深圳百度seo整站
  • 给网站加个地图的代码网上营销怎么做
  • 深圳外贸网站怎么建精准营销包括哪几个方面
  • 网站开发工程师应聘书范文1000百度搜索推广优化师工作内容
  • 北京网站开发网站建设咨询十大网络舆情案例
  • 设计网站musil搜索引擎优化的定义
  • 歌曲推广平台有哪些武汉整站优化
  • 织梦做网站利于优化排名优化公司口碑哪家好
  • 营销型企业网站优化数据分析师培训机构推荐
  • 电子商务网站开发常用工具站长之家域名信息查询
  • cms网站模板网络营销型网站
  • 商务网站的类型一共有几大类搜索引擎优化宝典
  • 免费建立一个个人网站百度官方优化软件
  • 网站分为几种类型站长工具精华
  • 建设通是正规网站吗百度广告收费标准
  • 网站建设logo个人网站怎么做
  • b2b网站想申请支付宝借口百度文库账号登录入口
  • 免费企业网站建设哪种百度官网下载电脑版
  • 导航网站 黄色百度热搜榜排名今日头条
  • 陕西免费做网站公司灰色词快速排名方法