简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:介绍C++11 thread线程用法
2.C++11 thread创建传参线程
<1>. t1.join(): 主进程等待任务线程示例
#include <iostream>
#include <thread>
#include <unistd.h>
using namespace std;
void task_01(){
printf("xxx------->%s(), line = %d\n",__FUNCTION__,__LINE__);
}
void task_02(int i){
printf("xxx------->%s(), line = %d\n",__FUNCTION__,__LINE__);
while(i < 1000)
i++;
printf("xxx------->%s(), line = %d, i = %d\n",__FUNCTION__,__LINE__,i);
}
int main(){
int i = 0, j = 0;
//1.任务线程不带参数
thread t1(task_01);
//2.任务线程带参数
thread t2(task_02, i);
//t1.detach();//线程与进程分离,各自执行,顺序是混换的.
t1.join();//主进程等待线程执行结束,然后主进程开始执行.
printf("xxx------->%s(), line = %d\n",__FUNCTION__,__LINE__);
return 0;
}
打印:
xxx------->task_01(), line = 7
xxx------->task_01(), line = 10, i = 1000
xxx------->main(), line = 20
在thread中创建一个任务线程task_01(),并将参数i = 1传进去; 然后 t1.join();
通过打印看出,主进程会等待线程执行完毕,才开始执行.
<2>. t1.detach(): 主进程和任务线程分离示例
#include <iostream>
#include <thread>
#include <unistd.h>
using namespace std;
void task_01(int i){
printf("xxx------->%s(), line = %d\n",__FUNCTION__,__LINE__);
while(i < 1000)
i++;
printf("xxx------->%s(), line = %d, i = %d\n",__FUNCTION__,__LINE__,i);
}
int main(){
int i = 0, j = 0;
//1.任务线程.
thread t1(task_01, i);
t1.detach();//线程与进程分离,各自执行,顺序是混换的.
//t1.join();//主进程等待线程执行结束,然后主进程开始执行.
printf("xxx------->%s(), line = %d\n",__FUNCTION__,__LINE__);
return 0;
}
打印
xxx------->main(), line = 20文章来源:https://www.toymoban.com/news/detail-414416.html
在thread中创建一个任务线程task_01(),并将参数i = 1传进去; 然后 t1.detach();
通过打印看出,主进程和任务线程各自执行,结果是主进程执行完了,任务线程没来的及执行;
也有可能,任务线程执行完了,主进程还没来得及执行,这种情况都有可能.文章来源地址https://www.toymoban.com/news/detail-414416.html
<3>.线程传递对象引用
#include<iostream>
#include<thread>
using namespace std;
class A {
public:
int num;
A(){};
};
void test(A& a) {
a.num = 199;
cout << "a.num = " << a.num << endl;
}
int main() {
A a;
a.num = 10;
thread th(test, std::ref(a));
th.join();
cout << "a.num = " << a.num << endl;
return 0;
}
<4>.线程传递指针对象
#include<iostream>
#include<thread>
using namespace std;
class A {
public:
int num;
A(){};
};
void test(A* a) {
a->num = 199;
cout << "a.num = " << a->num << endl;
}
int main() {
A *a = new A();
a->num = 10;
//thread th(test, std::ref(a));
thread th(test, a);
th.join();
cout << "a.num = " << a->num << endl;
return 0;
}
<5>.线程传递this指针
#include<iostream>
#include<thread>
using namespace std;
class A {
public:
int num;
A(){};
void print();
};
void test(A* a) {
a->num = 199;
cout << "a.num = " << a->num << endl;
}
void A::print(){
thread th(test, this);
th.join();
cout << "a.num = " << this->num << endl;
}
int main() {
A *a = new A();
a->num = 10;
a->print();
return 0;
}
<6>.thread线程lambda表达式用法
/***********************************************************
* Author : 公众号: Android系统攻城狮
* Create time : 2023-07-28 22:06:42 星期五
* Filename : thread_lambda_05.cpp
* Description :
************************************************************/
#include <iostream>
#include <thread>
#include <chrono>
#include <atomic>
#include <mutex>
#include <thread>
int main(){
std::mutex mutex;
std::thread thread = std::thread([&]() {
std::lock_guard<decltype(mutex)> lock(mutex);
for (int i=10; i>0; --i) {
std::cout << i << std::endl;
std::this_thread::sleep_for (std::chrono::seconds(1));
}
});
thread.join();
return 0;
}
到了这里,关于C++之C++11 thread线程示例(一百三十八)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!