zoukankan      html  css  js  c++  java
  • C++多线程

    目录

    1、简单多线程实例(使用join())

    2、简单多线程实例(使用detach())

    3、带参子线程

    4、多线程竞争数据,使用mutex阻止多线程之间数据的竞争

    5、网络编程&多线程的讲解

    6、Qt&Socket网络编程

    1、简单多线程实例(使用join())

    使用thread创建子线程,并立马使用jion()阻塞住,直到子线程执行完毕;(两个子线程并行执行,join函数会阻塞主流程,所以子线程都执行完成之后才继续执行主线程)代码如下:

     1 #include <iostream>
     2 #include <thread>
     3 #include <Windows.h>
     4 
     5 using namespace std;
     6 
     7 void thread01()
     8 {
     9     cout << "Thread 01 is working !" << endl;
    10     Sleep(100);
    11     cout << "Thread 01 is sleeping over !" << endl;
    12 }
    13 void thread02()
    14 {
    15     cout << "Thread 02 is working !" << endl;
    16     Sleep(100);
    17     cout << "Thread 02 is sleeping over !" << endl;
    18 }
    19 
    20 int main()
    21 {
    22     thread task01(thread01);  //创建子线程并执行该子线程
    23     thread task02(thread02);
    24     task01.join();  //等待线程task01执行完毕之后,再去执行下一句
    25     task02.join();  //等待线程task02执行完毕之后,再去执行下一句
    26     for (int i = 0; i < 2; i++)
    27     {
    28         cout << "Main thread is working !" << endl;
    29         Sleep(200);
    30     }
    31 
    32     system("pause");
    33 }
    简单子线程实例

    执行结果:

     执行第二遍:

     2、简单多线程实例---使用detach()

    detach将子线程从主流程中分离,独立运行,不会阻塞主线程:

     1 #include <iostream>
     2 #include <thread>
     3 #include <Windows.h>
     4 
     5 using namespace std;
     6 
     7 void thread01()
     8 {
     9     cout << "Thread 01 is working !" << endl;
    10     Sleep(100);
    11     cout << "Thread 01 is sleeping over !" << endl;
    12 }
    13 void thread02()
    14 {
    15     cout << "Thread 02 is working !" << endl;
    16     Sleep(100);
    17     cout << "Thread 02 is sleeping over !" << endl;
    18 }
    19 
    20 int main()
    21 {
    22     thread task01(thread01);  //创建子线程并执行该子线程
    23     thread task02(thread02);
    24     task01.detach();  //等待线程task01执行完毕之后,再去执行下一句
    25     task02.detach();  //等待线程task02执行完毕之后,再去执行下一句
    26     for (int i = 0; i < 2; i++)
    27     {
    28         cout << "Main thread is working !" << endl;
    29         Sleep(200);
    30     }
    31 
    32     system("pause");
    33 }
    简单多线程实例---使用detach()

    3、带参子线程

     1 #include <iostream>
     2 #include <thread>
     3 #include <Windows.h>
     4 
     5 using namespace std;
     6 
     7 void thread01(int num)
     8 {
     9     cout << "Thread 01 is working !" << endl;
    10     cout << "Thread01's sleeping time is " << num << endl;
    11     Sleep(100);
    12     cout << "Thread 01 is sleeping over !" << endl;
    13 }
    14 void thread02(int num)
    15 {
    16     cout << "Thread 02 is working !" << endl;
    17     cout << "Thread02's sleeping time is " << num << endl;
    18     Sleep(300);
    19     cout << "Thread 02 is sleeping over !" << endl;
    20 }
    21 
    22 int main()
    23 {
    24     thread task01(thread01,100);  //创建子线程并执行该子线程
    25     thread task02(thread02,300);
    26     task01.join();  //等待线程task01执行完毕之后,再去执行下一句
    27     task02.join();  //等待线程task02执行完毕之后,再去执行下一句
    28     for (int i = 0; i < 2; i++)
    29     {
    30         cout << "Main thread is working !" << endl;
    31         Sleep(200);
    32     }
    33 
    34     system("pause");
    35 }
    带参子线程

     4、多线程竞争数据,使用mutex阻止多线程之间数据的竞争(互斥量)

    因为在线程1和线程2只均改变了全局变量totalNum
    为了在使多线程之间相互影响,需要声明一个互斥对象保持数据同步

    互斥量技术从字面也可以理解,就是临界区有线程访问,其它线程就得排队等待,它们的访问是互斥的,实现方式就是给临界区加锁与释放锁。

     1 #include <iostream>
     2 #include <thread>
     3 #include <Windows.h>
     4 #include <mutex>
     5 
     6 using namespace std;
     7 int totalNum = 100;
     8 
     9 /*
    10 因为在线程1和线程2只均改变了全局变量totalNum
    11 为了在使多线程之间相互影响,需要声明一个互斥对象保持数据同步
    12 */
    13 std::mutex mu;  //声明线程互斥对象
    14 
    15 void thread01(int num)
    16 {
    17     mu.lock();  //同步数据锁
    18     cout << totalNum << endl;
    19     totalNum--;
    20     Sleep(100);
    21     mu.unlock();  //解除锁定
    22 }
    23 void thread02(int num)
    24 {
    25     mu.lock();  //同步数据锁
    26     cout << totalNum << endl;
    27     totalNum--;
    28     Sleep(300);
    29     mu.unlock();  //解除锁定
    30 }
    31 
    32 int main()
    33 {
    34     thread task01(thread01,100);  //创建子线程并执行该子线程
    35     thread task02(thread02,300);
    36     task01.join();  //等待线程task01执行完毕之后,再去执行下一句
    37     task02.join();  //等待线程task02执行完毕之后,再去执行下一句
    38     for (int i = 0; i < 2; i++)
    39     {
    40         cout << "Main thread is working !" << endl;
    41         Sleep(200);
    42     }
    43 
    44     system("pause");
    45 }
    metux阻止多线程数据相互影响

    上面代码中,子函数Tread01()和Tread02()中的语句:totalNum--;即临界区。

    不同线程之间相互有数据干扰的地方就是临界区。(或引起问题的地方)

    5、网络编程&多线程的讲解

    参考博客:

    https://blog.csdn.net/qq_42564846/article/details/82736100  参考了《TCP/IP网络编程 ---尹圣雨》

    6、Qt&Socket网络编程

    参考博客:

    https://blog.csdn.net/u014252478/article/details/80377103

  • 相关阅读:
    洛谷P1908 逆序对
    codevs1690 开关灯
    洛谷P1195 口袋的天空
    洛谷P1816 忠诚
    洛谷P1536 村村通
    洛谷P3045 [USACO12FEB]牛券Cow Coupons
    洛谷P1801 黑匣子_NOI导刊2010提高(06)
    洛谷P2947 [USACO09MAR]仰望Look Up
    Android(java)学习笔记51:ScrollView用法
    Android(java)学习笔记50:通过反射获取成员变量和成员方法并且使用
  • 原文地址:https://www.cnblogs.com/YiYA-blog/p/11449140.html
Copyright © 2011-2022 走看看