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