gpt4 book ai didi

C++多线程中断

转载 作者:行者123 更新时间:2023-11-28 06:04:16 25 4
gpt4 key购买 nike

如您在主函数中所见,我创建了一组线程,它们执行完全相同的函数但参数不同。该函数只是打印出 vector 的值。现在的问题是这些线程相互干扰。我的意思是,一个线程在另一个线程开始之前没有完成打印 (cout),就像 sdkljasjdkljsad 一样。我想要某种困惑的秩序,例如:

Thread 1 Vector[0]
Thread 2 Vector[0]
Thread 1 Vector[1]
Thread 3 Vector[0]
Thread 4 Vector[0]
Thread 2 Vector[1]

而不是:

Thread 1 Thread 2 Vector[0] Vector[0]
Thread 2 Vector[1]
Thread 1 Thread 4 Vector[1] Thread 3 Vector[0] Vector[1]

我该如何解决这个问题?附言数据文件只是球员姓名、体重和每行卧推的列表。将它们转换为字符串并放入 vector 中(是的,听起来很愚蠢,但我只是在完成一项任务)。

#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <string>
#include <thread>
#include <sstream>
#include <iomanip>
#include <boost/thread.hpp>
#include <boost/bind.hpp>


using namespace std;

vector<string> Kategorijos;
vector< vector<string> > Zaidejai;
ifstream duom("duom.txt");

string precision(double a) {
ostringstream out;
out << setprecision(6) << a;
return out.str();
}

void read() {
string tempKat;
int tempZaidSk;
vector<string> tempZaid;

string vardas;
int svoris;
double pakeltasSvoris;
while (duom >> tempKat >> tempZaidSk) {

Kategorijos.push_back(tempKat);
for (int i = 0; i < tempZaidSk; i++) {

duom >> vardas >> svoris >> pakeltasSvoris;
tempZaid.push_back(vardas + " " + to_string(svoris) + " " + precision(pakeltasSvoris));
}
Zaidejai.push_back(tempZaid);
tempZaid.clear();
}
duom.close();
}


void writethreads(int a) {
int pNr = a+1;
for (int i = 0; i < (int)Zaidejai[a].size(); i++) {
cout << endl << "Proceso nr: " << pNr << " " << i << ": " << Zaidejai[a][i] ;
}
}

void print() {
for (int i = 0; i < (int)Kategorijos.size(); i++) {
cout << "*** " << Kategorijos[i] << " ***" << endl;
for (int j = 0; j < (int)Zaidejai[i].size(); j++) {
cout << j+1<<") "<< Zaidejai[i][j] << endl;
}
cout << endl;
}
cout << "-------------------------------------------------------------------" << endl;
}

int main()
{
read();
print();

boost::thread_group threads
;
for (int i = 0; i < (int)Kategorijos.size(); i++) {

threads.create_thread(boost::bind(writethreads, i));

}

threads.join_all();

system("pause");
return 0;
}

最佳答案

欢迎来到线程同步的问题!当一次只有一个线程可以使用一种资源时,您用来控制该资源的锁就是互斥锁。您还可以存储一个线程的数据以在最后输出,或者您可以让线程在屏障处同步。

关于C++多线程中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32726137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com