关于 C++多线程的一个问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
n0o0a0h0
V2EX    C

关于 C++多线程的一个问题

  •  
  •   n0o0a0h0 2015 年 6 月 20 日 2480 次点击
    这是一个创建于 3891 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在学长让我把一个1300多行的代码改成多线程,%>_<%,然后开始看了一些多线程的指导,链接在此
    有一个例子如下所示:

    #include <iostream> #include <thread> satic const int num_threads = 10; //This function will be called from a thread void call_from_thread(int tid) { std::cout << "Launched by thread " << tid << std::endl; } int main() { std::thread t[num_threads]; //Launch a group of threads for (int i = 0; i < num_threads; ++i) { t[i] = std::thread(call_from_thread, i); } std::cout << "Launched from the main\n"; //Join the threads with the main thread for (int i = 0; i < num_threads; ++i) { t[i].join(); } return 0; } 

    例子说它的输出应该为:

    但是我的输出确实乱掉的:

    我是在xcode里面编译的哦。
    感谢各位指导。如果能指引一下多线程的方向就更感谢啦!

    第 1 条附言    2015 年 6 月 21 日
    多谢大家,使用mutex锁住cout即可:
    ```
    static std::mutex mtx;
    ```
    ```
    mtx.lock();
    std::cout << "Launched by thread " << tid << std::endl;
    mtx.unlock();
    ```
    ```
    Launched by thread 4
    Launched by thread 3
    Launched by thread 1
    Launched by thread 5
    Launched by thread 0
    Launched by thread 2
    Launched by thread 6
    Launched by thread 7
    Launched by thread 8
    Launched from the main
    Launched by thread 9
    ```

    又一个问题来了,是否可以控制thread输出的顺序呢?
    第 2 条附言    2015 年 6 月 21 日
    (http://www.cplusplus.com/reference/mutex/mutex/lock/)的例子跟我这个差不多,锁住之后就是正常按照顺序输出,晕.
    现在学长要求我讲SVM(支持向量机)一共1500多行放到多thread去执行。里面的算法是搞懂了,但是多个thread执行。感觉是没有什么思路。
    18 条回复    2015-06-22 10:08:19 +08:00
    aheadlead
        1
    aheadlead  
       2015 年 6 月 20 日
    46fo
        2
    46fo  
       2015 年 6 月 20 日
    0o0 按理说是一次性输出的
    limhiaoing
        3
    limhiaoing  
       2015 年 6 月 20 日
    你看的那篇文章里写了这么一句话
    Actually if you run the above code on your system you can get a completely different result or even some mangled characters.
    limhiaoing
        4
    limhiaoing  
       2015 年 6 月 20 日
    我也写过一篇关于C++11 多线程的简单的入门文章
    http://blog.poxiao.me/p/multi-threading-in-cpp11-part-1-thread-and-future/
    涉及到 std::thread std::future std::async std::promise std::packaged_task等
    zonyitoo
        5
    zonyitoo  
       2015 年 6 月 21 日
    乱掉很正常,你给的例子里它也是乱掉的,只是没有你的这么乱罢了。
    多线程同时调用cout,没有人能知道它到底是以什么样的顺序进入到cout的buffer里面。
    正确的姿势是用Mutex锁住cout。
    n0o0a0h0
        6
    n0o0a0h0  
    OP
       2015 年 6 月 21 日
    @limhiaoing 谢谢 你的blog 写得好详细 我细细品味一下
    @aheadlead
    @zonyitoo
    谢谢两位 我是初学者啦~~~
    @xdeng 可以参考楼上的回答
    46fo
        7
    46fo  
       2015 年 6 月 21 日
    原来是c++11 自带的线程
    aheadlead
        8
    aheadlead  
       2015 年 6 月 21 日
    @n0o0a0h0 加油!
    secondwtq
        9
    secondwtq  
       2015 年 6 月 21 日
    我在 Linux 下测试,结果和原文差不多。
    在 Mac 下测试,结果和楼主给的差不多。
    SoloCompany
        10
    SoloCompany  
       2015 年 6 月 21 日
    头像好萌
    chlx
        11
    chlx  
       2015 年 6 月 21 日
    即使满足sequential order也是乱掉的。 同楼上, 锁住cout
    middleware
        12
    middleware  
       2015 年 6 月 21 日
    iostream 自己有同步。由 sync_with_stdio() 控制。
    shimoyo
        13
    shimoyo  
       2015 年 6 月 21 日 via iPhone
    前段时间的操作系统课讲的进程的互斥,老师讲的例子几乎和这个一样……
    inevermore
        14
    inevermore  
       2015 年 6 月 21 日
    你们啊,naive,最简单的方式是使用printf,他是默认原子性的。
    n0o0a0h0
        15
    n0o0a0h0  
    OP
       2015 年 6 月 21 日
    @chlx 锁定了哦 不知道是否可以控制thread输出的是顺序呢?
    n0o0a0h0
        16
    n0o0a0h0  
    OP
       2015 年 6 月 21 日
    @inevermore 其实也是初学这方面 ~~多谢批评
    Axurez
        17
    Axurez  
       2015 年 6 月 22 日
    cppreference 的例子说了,Possible output (order of lines may vary, but they are never intermingled)
    并不是顺序的
    n0o0a0h0
        18
    n0o0a0h0  
    OP
       2015 年 6 月 22 日
    @Axurez 好的~~~ 谢谢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1993 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 11:57 PVG 9:57 LAX 03:57 JFK 06:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86