三行代码  ›  专栏  ›  技术社区  ›  rm1948

osyncstream输出乱码文本并导致seg故障

  •  0
  • rm1948  · 技术社区  · 1 周前

    此代码在使用osyncstream时输出垃圾字符、不总是同步以及seg错误。当直接输出到std::cout时,输出不同步,但输出良好且不seg故障。

    #include <atomic>
    #include <chrono>
    #include <iostream>
    #include <syncstream>
    #include <thread>
    
    std::osyncstream sync_out { std::cout };
    //std::ostream& sync_out { std::cout };
    
    void test_ths(int th) {
    
        while(true) {
            sync_out << "th " << th << " wait 1\n";
    //        std::this_thread::sleep_for(std::chrono::milliseconds(30 + 2 * th));
            std::this_thread::sleep_for(std::chrono::milliseconds(30));
    
            sync_out << "th " << th << " wait 2\n";
    //        std::this_thread::sleep_for(std::chrono::milliseconds(30 + 2 * th));
            std::this_thread::sleep_for(std::chrono::milliseconds(30));
    
            // needed to force output from osyncstream
            sync_out.emit();  // comment out when using std::cout
        }
    }
    int main() {
    
        std::jthread t1([] {
            test_ths(1);
        });
    
        std::jthread t2([] {
            test_ths(2);
        });
    
        std::jthread t3([] {
            test_ths(3);
        });
    
        std::jthread t4([] {
            test_ths(4);
        });
    
        t1.join();
        t2.join();
        t3.join();
        t4.join();
    }
    

    示例输出说明问题。

    th 2 wait 1
    th th 4 wait 2
    3 wait 2
    th 1 wait 2
    th 2 wait 2
    th t 1
    th о�ޓ�F�ߓ�F�@FfW��,@���W�th 4 wait 1
    th  wait 1
    th 2 wait 1
    th 3 wait 2
    th 4 wait 2
    th 2 wait 2
    th 3 wait 2
    th 1 wait 2
    th 2 wait 1
    th 4 wait 1
    th 3 wait 1
    Segmentation fault (core dumped)
    

    睡觉 时间是一样的。注释掉的行介绍了一些 抖动

    使用std::cout时,使用 sync_out.emit();

    我对 osyncstream 不同线程的输出不应该混合,也就是说,这就是它的目的。

    1 回复  |  直到 1 周前
        1
  •  2
  •   T.C.    1 周前

    不是这样的 osyncstream 应该被使用。每个线程都需要构造自己的线程 ; 在访问时没有同步 osyncstream 它本身仅由执行的传输 emit 是同步的,然后仅针对其包装的streambuf。

    拥有全球 osyncstream 因此,这完全没有意义。