鱼C论坛

 找回密码
 立即注册
查看: 2853|回复: 6

C++如何多线程处理

[复制链接]
发表于 2019-7-18 14:24:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有没有简单点的多线程介绍以及如何多线程工作.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-7-19 10:10:21 | 显示全部楼层
c++不是不支持多线程的吗?我也是小白,也想问一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-19 14:27:43 | 显示全部楼层
本帖最后由 Croper 于 2019-7-19 15:03 编辑

。。首先,c++是支持多线程的。。
第二,这玩意讲起来一堆一堆的,我都不知道从哪儿开始,况且我也掌握得不深。。

先说一个最简单的吧,stdlib是自带thread的。使用thread,能简单地创建一个线程
  1. #include<iostream>
  2. #include<thread>

  3. using namespace std;

  4. void HelloFishC() {
  5.         cout << "Hello FishC!" << endl;
  6. }

  7. int main() {
  8.         thread thr(HelloFishC);
  9.         thr.join();                 //等待线程执行完毕,在函数完结前,需要使用join()等待线程结束或detach()分离线程
  10.         system("pause");
  11. }
复制代码

上面的代码就是创建一个新线程然后让它打印出hello fishc
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-19 14:47:53 | 显示全部楼层
本帖最后由 Croper 于 2019-7-19 15:01 编辑

在比如,在进行一个耗时较长的运算时(比如从1加到1000000000),会耗时很长的时间,这个时候,可以利用thread给它加一个进度条
  1. #include<iostream>
  2. #include<thread>
  3. #include<mutex>
  4. #include<windows.h>

  5. using namespace std;

  6. mutex m_cursor;   //移动光标再打印时最好加个锁,否则可能出现进程A移动光标->进程B移动光标->进程A打印->进程B打印导致的排版混乱

  7. //移动控制台光标的函数
  8. void gotoxy(int x, int y) {
  9.         COORD coord = { x,y };
  10.         HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
  11.         SetConsoleCursorPosition(hscr, coord);
  12. }


  13. //绘制进度条的函数
  14. void PrintProcess(volatile int* pnum, int den) {
  15.         volatile int& num = *pnum;
  16.         m_cursor.lock();
  17.         gotoxy(0, 1);
  18.         cout << "计算中..";
  19.         gotoxy(0, 3);
  20.         for (int i = 0; i < 100; ++i) {
  21.                 cout << "-";
  22.         }
  23.         m_cursor.unlock();
  24.         for (int i = 0; i < 100; ++i) {
  25.                 while ((double)num / den * 100 < i) {
  26.                         Sleep(10);
  27.                 }
  28.                 m_cursor.lock();
  29.                 gotoxy(i, 3);
  30.                 cout << "|";
  31.                 m_cursor.unlock();
  32.         }
  33. }

  34. int main() {
  35.         long long sum = 0;
  36.         volatile int i;                                   //使用volatile告诉编辑器不要优化,否则可能出现进程间的数据不一致
  37.         int maxi = 1000000000;
  38.         thread thr(PrintProcess, &i, maxi);  //注意向函数传递参数的方法,不能直接传递引用
  39.         for (i = 0; i < maxi; ++i) {
  40.                 sum += i;
  41.         }
  42.         thr.join();
  43.         m_cursor.lock();
  44.         gotoxy(0, 1);
  45.         cout << "计算完毕,答案是" << sum;
  46.         gotoxy(0, 5);
  47.         m_cursor.unlock();
  48.         system("pause");
  49. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-19 15:05:57 | 显示全部楼层
本帖最后由 Croper 于 2019-7-19 15:15 编辑

leetcode最近也上线了几道多线程的题目,有兴趣可以去试试https://leetcode-cn.com/problemset/concurrency/

嗯,兔子.jpg没有问题
thread_29048902712109_20190629172030_s_65863_w_600_h_734_34044.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-19 16:37:43 | 显示全部楼层
Croper 发表于 2019-7-19 14:47
在比如,在进行一个耗时较长的运算时(比如从1加到1000000000),会耗时很长的时间,这个时候,可以利用thr ...

令人头痛
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-19 21:40:19 | 显示全部楼层
所以你到底是哪里看不懂呢,哪里弄不懂直接提出来,你这样让我怎么回答啊?

如果问多线程我肯定是默认c++的基础已经学得差不多了啊,
你不需要管gotoxy是如何实现的,剩下这些代码涉及的就只有thread和mutex里最基础的几个东西了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-15 13:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表