C++ 多线程
创建线程 thread
jion与detach方式的区别
- jion方式:必须等待创建并启动的子线程任务执行完毕,才会继续往下执行。
示例:
#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <string>
#include <thread>
using namespace std;
void my_func1_task()
{
cout << "I am my_func1_task" << endl;
cout << "my_func1_task end" << endl;
}
void my_func2_task(int x)
{
cout << "I am my_func2_task" << endl;
while (x--)
{
cout << "x:" << x << ";";
sleep(1);
}
cout << endl;
cout << "my_func2_task end" << endl;
}
int main(int argc, char *argv[])
{
cout << "this is main()" << endl;
thread thread_1(my_func1_task);
thread_1.join();
thread thread_2(my_func2_task, 10);
thread_2.join();
cout << "thread end" << endl;
cout << "main end" << endl;
return 0;
}
测试结果:
- detach方式:启动的子线程自主在后台运行,当前主线程代码继续往下执行,无需等待子线程结束。
示例:
#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <string>
#include <thread>
using namespace std;
void my_func1_task()
{
cout << "I am my_func1_task" << endl;
cout << "my_func1_task end" << endl;
}
void my_func2_task(int x)
{
cout << "I am my_func2_task" << endl;
while (x--)
{
cout << "x:" << x << ";";
sleep(1);
}
cout << endl;
cout << "my_func2_task end" << endl;
}
int main(int argc, char *argv[])
{
cout << "this is main()" << endl;
thread thread_1(my_func1_task);
thread_1.detach();
thread thread_2(my_func2_task, 10);
thread_2.detach();
cout << "thread end" << endl;
cout << "main end" << endl;
return 0;
}
测试结果:
线程锁 mutex
lock和unlock
不上锁测试示例:
#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <string>
#include <thread>
using namespace std;
int g_count = 10;
void my_func1_task()
{
while (g_count-- > 0)
{
cout << "===func1===";
sleep(1);
}
cout << endl;
}
void my_func2_task()
{
while (g_count-- > 0)
{
cout << "***func2***";
sleep(1);
}
cout << endl;
}
int main(int argc, char *argv[])
{
cout << "this is main()" << endl;
thread thread_1(my_func1_task);
thread thread_2(my_func2_task);
thread_1.join();
thread_2.join();
return 0;
}
测试结果:
上锁测试示例:
#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <string>
#include <thread>
#include <mutex>
using namespace std;
int g_count = 10;
mutex g_countMtx;
void my_func1_task()
{
g_countMtx.lock();
while (g_count-- > 0)
{
cout << "===func1===";
sleep(1);
}
cout << endl;
g_countMtx.unlock();
}
void my_func2_task()
{
g_countMtx.lock();
while (g_count-- > 0)
{
cout << "***func2***";
sleep(1);
}
cout << endl;
g_countMtx.unlock();
}
int main(int argc, char *argv[])
{
cout << "this is main()" << endl;
thread thread_1(my_func1_task);
thread thread_2(my_func2_task);
thread_1.join();
thread_2.join();
return 0;
}
测试结果:
lock_guard
- 作用:放在在lock后,忘记unlock。
- 使用:在创建lock_guard对象时,将尝试获取提供给它的互斥锁的所有权。当控制流离开lock_guard对象的作用域时,lock_guard析构并释放互斥锁。
- 特点:创建即加锁,作用域结束自动析构并解锁;不能中途解锁,必须等作用域结束才能解锁。
- 使用技巧:可以根据需要通过使用{}增加临时作用域。
测试示例:
#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <string>
#include <thread>
#include <mutex>
using namespace std;
int g_count = 10;
mutex g_countMtx;
void my_func1_task()
{
lock_guard<mutex> guard(g_countMtx);
while (g_count-- > 0)
{
cout << "===func1===";
sleep(1);
}
cout << endl;
}
void my_func2_task()
{
lock_guard<mutex> guard(g_countMtx);
while (g_count-- > 0)
{
cout << "***func2***";
sleep(1);
}
cout << endl;
}
int main(int argc, char *argv[])
{
cout << "this is main()" << endl;
thread thread_1(my_func1_task);
thread thread_2(my_func2_task);
thread_1.join();
thread_2.join();
return 0;
}
测试结果: