2015-09-22 49 views
0

正如您在主函数中看到的,我创建了一组线程,它们使用不同的参数执行完全相同的功能。该功能只是打印出矢量的值。现在问题是这些线程互相干扰。我的意思是一个线程在另一个线程开始之前没有完成打印(cout),并且它像sdkljasjdkljsad一样。我需要某种秩序混乱,比如,例如:
C++多线程中断

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] 

我怎样才能解决这个问题?附:数据文件只是一个玩家名单,每行重量和台式压力机的列表。将它们转换为字符串并放置在矢量中(是的,听起来很愚蠢,但我只是在完成一项任务)。

#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; 
} 
+0

我必须使用线程以及控制台,这些都是任务的要求。我对Java做了同样的事情,唯一的区别是我已经创建了5个独立的线程,并且它完美地工作。然而,这是依赖于情况的,因为我知道数据文件中有5个数据块。用C++我想确保数据文件可以在不触及代码的情况下进行更改,这就是为什么我使用for循环和线程组的原因。 –

回答

1

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

+0

那里有一个错字。希望投票的人们将他们删除。 – Davislor

0

您可以使用适当的互斥锁将它们同步到控制台中。但在这种情况下,使用控制台输出,可能根本不使用线程。否则将打印发送到处理它的专用线程。

到使用通常cout重载operator <<另一种方法是写的内容到本地缓冲器或stringsteam(包括新的线),然后,用一个函数调用,编写到控制台。单个函数调用将有助于控制台编写器一次只写入一个缓冲区的内容。

+1

“将内容写入本地缓冲区并在一次调用中转发”是最佳解决方案。让操作系统负责锁定。 –