Multithreading 每秒执行一个操作的线程

Multithreading 每秒执行一个操作的线程,multithreading,c++11,cout,Multithreading,C++11,Cout,我试图创建一个并发代码,在这里我每秒执行一个函数,这个函数打印一个字符并在线程上等待一秒钟。我期望的行为是一个接一个地打印每个字符,但这不会发生,而是打印内部循环执行的所有字符。我不确定这是否与I/O操作或诸如此类的操作有关 我还尝试创建一个线程数组,其中每个线程都是在执行内部循环时创建的,但即使不调用join(),行为也会重复。代码可能有什么问题 下面的代码就是我试图做的,我使用了一个时钟来查看它是否在等待正确的时间 #include <iostream> #include <

我试图创建一个并发代码,在这里我每秒执行一个函数,这个函数打印一个字符并在线程上等待一秒钟。我期望的行为是一个接一个地打印每个字符,但这不会发生,而是打印内部循环执行的所有字符。我不确定这是否与I/O操作或诸如此类的操作有关

我还尝试创建一个线程数组,其中每个线程都是在执行内部循环时创建的,但即使不调用
join()
,行为也会重复。代码可能有什么问题

下面的代码就是我试图做的,我使用了一个时钟来查看它是否在等待正确的时间

#include <iostream>
#include <thread>
#include <chrono>
#include <string>

void print_char();

int main() {

    using Timer = std::chrono::high_resolution_clock;
    using te    = std::chrono::duration<double>;
    using s     = std::chrono::seconds;

    te interval;

    for (int i = 0; i < 100; i++) {
        auto  a = Timer::now();
        for (int j = 0; j < i; j++) {

            std::thread t(print_char);
            t.join();
        }
        auto b = Timer::now();
        interval = b-a;

        std::cout << std::chrono::duration_cast<s>(interval).count();
        std::cout << std::endl;
    }

        return 0;
}

void print_char() {
    std::cout << "*";
    std::this_thread::sleep_for(std::chrono::seconds(1));
}
#包括
#包括
#包括
#包括
无效打印字符();
int main(){
使用定时器=std::chrono::高分辨率时钟;
使用te=std::chrono::duration;
使用s=std::chrono::seconds;
te间期;
对于(int i=0;i<100;i++){
自动a=计时器::现在();
对于(int j=0;j
std::thread t(print_char);
t.join();
第一行创建并启动一个线程。第二行立即等待线程结束。这使您的程序串行而非并行。事实上,这与直接调用函数而不是创建线程没有什么不同

如果你想让线程独立于主线程并行运行,你应该在线程函数本身中设置循环

std::atomic<bool> keep_running = true;

void print_char() {
    while (keep_running) {
        std::cout << "*";
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

关于你当前的代码,它与

for (int i = 0; i < 100; i++) {
    auto  a = Timer::now();
    for (int j = 0; j < i; j++) {
        print_char();
    }
    auto b = Timer::now();
    interval = b-a;

    std::cout << std::chrono::duration_cast<s>(interval).count();
    std::cout << std::endl;
}
for(int i=0;i<100;i++){
自动a=计时器::现在();
对于(int j=0;j
std::thread t(print_char);
t.join();
第一行创建并启动一个线程。第二行立即等待线程结束。这使您的程序串行而非并行。事实上,这与直接调用函数而不是创建线程没有什么不同

如果你想让线程独立于主线程并行运行,你应该在线程函数本身中设置循环

std::atomic<bool> keep_running = true;

void print_char() {
    while (keep_running) {
        std::cout << "*";
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

关于你当前的代码,它与

for (int i = 0; i < 100; i++) {
    auto  a = Timer::now();
    for (int j = 0; j < i; j++) {
        print_char();
    }
    auto b = Timer::now();
    interval = b-a;

    std::cout << std::chrono::duration_cast<s>(interval).count();
    std::cout << std::endl;
}
for(int i=0;i<100;i++){
自动a=计时器::现在();
对于(int j=0;j
您需要刷新输出流以查看文本:

std::cout << "*" << std::flush;
std::cout
我期望的行为是一个接一个地打印每个字符,但这不会发生,而是打印内部循环执行的所有字符

您需要刷新输出流以查看文本:

std::cout << "*" << std::flush;

std::cout我的代码的目的是使用线程一秒一秒地显示每个字符
因为我想在创建另一个线程后等待一秒钟来打印字符,对吗?这是一个串行执行,但每次等待一秒钟。即使我删除线程代码并直接调用函数,在主线程中等待一秒钟也不能解决问题。不幸的是,它会在一行之后打印(等待
j
秒打印该行)“其他,而不是一次显示一个字符。@RafaelCamposNunes我用循环显示的线程函数将每秒显示一次字符,只要它正在运行。如果您只想在一定时间内每秒显示一个字符,为什么还要麻烦从线程开始呢?代码中的线程毫无意义。没错,这是错误的。”在此上下文中读取没有多大意义,但这是一个赋值,我必须在此上下文中处理线程。我认为问题可能出在I/O方面?我将尝试取消I/O的同步。我的代码的目的是使用线程一秒接一秒地显示每个字符。然后使用
join()
因为我想在创建另一个线程后等待一秒钟来打印字符,对吗?这是一个串行执行,但每次等待一秒钟。即使我删除线程代码并直接调用函数,在主线程中等待一秒钟也不能解决问题。不幸的是,它会在一行之后打印(等待
j
秒打印该行)“其他,而不是一次显示一个字符。@RafaelCamposNunes我用循环显示的线程函数将每秒显示一次字符,只要它正在运行。如果您只想在一定时间内每秒显示一个字符,为什么还要麻烦从线程开始呢?代码中的线程毫无意义。没错,这是错误的。”在这种情况下读取没有多大意义,但这是一个分配,我必须在这种情况下处理线程。我认为问题可能在I/O方面?我将尝试取消I/O的同步。