内裤里有糖吃 发表于 2019-7-18 14:24:15

C++如何多线程处理

有没有简单点的多线程介绍以及如何多线程工作.

AUGLow 发表于 2019-7-19 10:10:21

c++不是不支持多线程的吗?我也是小白,也{:10_269:}想问一下

Croper 发表于 2019-7-19 14:27:43

本帖最后由 Croper 于 2019-7-19 15:03 编辑

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

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

using namespace std;

void HelloFishC() {
        cout << "Hello FishC!" << endl;
}

int main() {
        thread thr(HelloFishC);
        thr.join();               //等待线程执行完毕,在函数完结前,需要使用join()等待线程结束或detach()分离线程
        system("pause");
}
上面的代码就是创建一个新线程然后让它打印出hello fishc

Croper 发表于 2019-7-19 14:47:53

本帖最后由 Croper 于 2019-7-19 15:01 编辑

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

using namespace std;

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

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


//绘制进度条的函数
void PrintProcess(volatile int* pnum, int den) {
        volatile int& num = *pnum;
        m_cursor.lock();
        gotoxy(0, 1);
        cout << "计算中..";
        gotoxy(0, 3);
        for (int i = 0; i < 100; ++i) {
                cout << "-";
        }
        m_cursor.unlock();
        for (int i = 0; i < 100; ++i) {
                while ((double)num / den * 100 < i) {
                        Sleep(10);
                }
                m_cursor.lock();
                gotoxy(i, 3);
                cout << "|";
                m_cursor.unlock();
        }
}

int main() {
        long long sum = 0;
        volatile int i;                                 //使用volatile告诉编辑器不要优化,否则可能出现进程间的数据不一致
        int maxi = 1000000000;
        thread thr(PrintProcess, &i, maxi);//注意向函数传递参数的方法,不能直接传递引用
        for (i = 0; i < maxi; ++i) {
                sum += i;
        }
      thr.join();
        m_cursor.lock();
        gotoxy(0, 1);
        cout << "计算完毕,答案是" << sum;
        gotoxy(0, 5);
        m_cursor.unlock();
        system("pause");
}

Croper 发表于 2019-7-19 15:05:57

本帖最后由 Croper 于 2019-7-19 15:15 编辑

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

嗯,兔子.jpg没有问题

内裤里有糖吃 发表于 2019-7-19 16:37:43

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

令人头痛

Croper 发表于 2019-7-19 21:40:19

所以你到底是哪里看不懂呢,哪里弄不懂直接提出来,你这样让我怎么回答啊?

如果问多线程我肯定是默认c++的基础已经学得差不多了啊,
你不需要管gotoxy是如何实现的,剩下这些代码涉及的就只有thread和mutex里最基础的几个东西了。
页: [1]
查看完整版本: C++如何多线程处理