我的多线程代码与c++不能正常工作


#include <iostream>
#include <fstream>
#include <thread>
#include <mutex>
#include <cctype>
#include <chrono>
#define MAX_THREADS 3
std::string file_path = "metin.txt";
int total_words = 0;
int total_sentences = 0;
int total_paragraphs = 0;
std::mutex lock;
void count_words() {
std::ifstream file(file_path);
if (!file) {
std::cout << "Dosya açılamadı." << std::endl;
return;
}
int words = 0;
char c;
while ((c = file.get()) != EOF) {
if (std::isspace(c)) {
words++;
}
}
lock.lock();
total_words += words;
lock.unlock();
file.close();
}
void count_sentences() {
std::ifstream file(file_path);
if (!file) {
std::cout << "Dosya açılamadı." << std::endl;
return;
}
int sentences = 0;
char c;
while ((c = file.get()) != EOF) {
if (c == '.') {
sentences++;
}
}
lock.lock();
total_sentences += sentences;
lock.unlock();
file.close();
}
void count_paragraphs() {
std::ifstream file(file_path);
if (!file) {
std::cout << "Dosya açılamadı." << std::endl;
return;
}
int paragraphs = 0;
char c;
while ((c = file.get()) != EOF) {
if (c == 'n') {
paragraphs++;
}
}
lock.lock();
total_paragraphs += paragraphs;
lock.unlock();
file.close();
}
int main() {
auto start_time = std::chrono::steady_clock::now(); // Başlangıç zamanı
std::thread threads[MAX_THREADS];
int i;
for (i = 0; i < MAX_THREADS; i++) {
if (i == 0) {
threads[i] = std::thread(count_words);
}
else if (i == 1) {
threads[i] = std::thread(count_sentences);
}
else {
threads[i] = std::thread(count_paragraphs);
}
}
for (i = 0; i < MAX_THREADS; i++) {
threads[i].join();
}
auto end_time = std::chrono::steady_clock::now(); // Bitiş zamanı
auto elapsed_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time); // Geçen süre
std::cout << "Toplam kelime sayısı: " << total_words << std::endl;
std::cout << "Toplam cümle sayısı: " << total_sentences << std::endl;
std::cout << "Toplam paragraf sayısı: " << total_paragraphs << std::endl;
std::cout << "Programın çalışma süresi: " << elapsed_time.count() << " ms" << std::endl; // Geçen süreyi ekrana yazdır
return 0;
}

我写了这段代码,计算使用多线程查找文件中的单词,句子和段落的数量。这段代码从一个名为"meeting .txt"的文件中读取数据。(您可以将数据视为长文本),并为每个函数(特性)使用单独的线程进行计算。我总共使用了3个线程。但我想我的线程不是同步运行(同时)。我感觉它是按顺序运行的,我弄不明白。你能帮我吗?我如何设计这段代码来同时运行我所有的线程?我还可以添加什么来进一步改进代码,如果代码不适合线程结构的逻辑,我可以改变什么来适应这个逻辑?(我在linux操作系统上运行此代码)。我对这个话题不是很熟悉,如果我问错了问题,很抱歉。

乍一看,问题可能出在互斥锁上。它序列化你所有的线程。

据我所知,这些线程不共享它们写入的任何数据。因此,您可以从代码中删除互斥锁。

编辑:如果你的线程共享它们写入的数据,你需要重新设计你的代码。

另一个问题可能是线程初始化时间检查每个函数完成所需的时间,并将其与串行和并行代码的总执行时间进行比较。尝试增加每个线程所做的工作。

另一种可能性是你的一个函数比另一个函数花费更多的时间来完成。你只是等待这个函数,你的代码不会从并行化中获得任何东西。

最新更新