2016-11-03 72 views
0

即時開始使用pthreads cpp庫來解決一些作業。初始化Pthreads while While循環

其中之一,我必須創建一個線程爲每個文件命名從1到T(T是固定的定義爲一個正整數),並且此線程必須處理該文件的一些信息。

其實,我的想法是把一個while循環主,這樣的:

pthread_t threads[T]; 

void *imprime(void *arg) { 

    int a=-1, b=-1; 
    string* t = reinterpret_cast<std::string*>(arg); //Recovering str 
    string name = *t; 
    cout<<"\nName: "<<name<<endl; 
    ifstream inFile(nome.c_str()); 
    while(inFile>>a) { 
      inFile>>b; 
      cout<<"a: "<<a<<"\nb: "<<b<<endl; 
    } 
} 

int main() { 

    int lim = 1; 
    string nome; 
    int a = 0, b = 0; 

    while(lim <= T) { 
     nome = to_string(lim); 
     cout<<"Opening: "<<lim<<endl; 
     pthread_create(&threads[lim], NULL, &imprime, (void *)&nome); 

     lim++; 
    } 
    cin.get(); 

    return 0; 
} 

首先,線程didnt跑,什麼都沒有發生。所以,我把「cin.get()」置於這個時間之下,它突然起作用(我還沒有理解)。

但是現在,如果T是1,它可以正常工作,但是如果T> 1,它不會像它應該工作的那樣工作。

我把兩個文件(名稱1,2和3;與整數 'a' 和由空格分隔 'B'):

/* 
    File '1' = "1 2" 
    File '2' = "3 4" 
    File '3' = "5 6" 
*/ 

並且那輸出:

Opening: 1 
Opening: 2 
Opening: 3 

Nome: 3 
a: 5 
b: 6 

Nome: 3 
a: 5 
b: 6 

Nome: 3 
a: 5 
b: 6 

由於某種原因,程序在啓動線程之前運行整個T次,並且用最後一個線程覆蓋每個線程。

我該怎麼辦?

+1

你錯過之前'加入所有的線程更好的選擇main()'退出。 –

+0

這是一種使用在'main'中被回收的變量共享數據的非常冒險的方式。理想情況下,你給出它所擁有的線程數據,你'main'永遠不會再觸及它。不能保證線程會在下一次循環迭代之前啓動並複製該字符串。 – tadman

+0

爲什麼不使用'std :: thread'呢? – 4386427

回答

1

傳遞一個指向nome的指針是一個壞主意,因爲您不能確定單個線程在將其更改爲main之前再次複製該值。

作出參數數組線程:

string threads_args[T]; 

,然後做

threads_args[lim] = to_string(lim); 
    cout<<"Opening: "<<lim<<endl; 
    pthread_create(&threads[lim], NULL, &imprime, (void *)&threads_args[lim]); 

另行通知:

1)你應該join在主線程,而不是使用cin.get

2)while(lim <= T)應爲while(lim < T)。目前您可以訪問數組邊界外。你也可能想lim0而不是1開始,然後有threads_args[lim] = to_string(lim+1);

3)C++ 11的std ::線程這似乎不是並行線程

+0

謝謝你,我做到了,現在它似乎工作。關於std :: threads,我的老師只給了我們使用pthreads = /的權限。 – Lucas

+0

非常有幫助。關於你的老師:我認爲這有點奇怪 - 至少如果你還沒有了解std :: thread。包含在C++中的線程系統應該是起點,IMO。 – 4386427