我有一个应该迭代3个字符串向量的函数。 我实现的线程函数是这样的:
#include<iostream>
#include<pthread.h>
#include<vector>
#include<string>
#include<fstream>
using namespace std;
int i_array1=-1,i_array2=0,i_array3=0;
int total_array1,total_array2,total_array3;
vector<string> array1;
vector<string> array2;
vector<string> array3;
pthread_mutex_t count;
void *dostuf(void *threadid) {
string u,p;
string i;
while(1){
pthread_mutex_lock(&count);
if(i_array1<total_array1-1){
i_array1++;
i=array1[i_array1];
u=array2[i_array2];
p=array3[i_array3];
}else{
i_array1=0;
i=array1[0];
if(i_array3<total_array3-1){
i_array3++;
p=array3[i_array3];
u=array2[i_array2];
}else{
i_array3=0;
if(i_array2<total_array2-1){
i_array2++;
p=array3[0];
u=array2[i_array2];
//cout<<u<<endl;
}else{
pthread_mutex_unlock(&count);
break;
}
}
}
cout<<i_array1<<" "<<i_array2<<" "<<i_array3<<endl;
pthread_mutex_unlock(&count);
}
}
int main(int argc, char *argv[]){
string x;
int rc,i;
pthread_t *threads;
int num_threads=2;
pthread_attr_t attr;
ifstream file1(argv[1]);
while(getline(file1,x)){
//cout<<(char*)line.c_str();
array1.push_back(x);
}
file1.close();
total_array1=array1.size();
ifstream file2(argv[2]);
while(getline(file2,x)){
//cout<<(char*)line.c_str();
array2.push_back(x);
}
file2.close();
total_array2=array2.size();
ifstream file3(argv[3]);
while(getline(file3,x)){
//cout<<(char*)line.c_str();
array3.push_back(x);
}
file3.close();
total_array3=array3.size();
cout<<total_array1<<" "<<total_array2<<" "<<total_array3<<endl<<endl;
threads=new pthread_t[num_threads];
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_mutex_init(&count,PTHREAD_PROCESS_PRIVATE);
for( i = 0; i < num_threads; i++ ) {
// cout << "main() : creating thread, " << i << endl;
rc = pthread_create(&threads[i], NULL, dostuf, NULL);
if (rc) {
cout << "Error:unable to create thread," << rc << endl;
}
}
for( i = 0; i < num_threads; i++ ) {
rc = pthread_join(threads[i], NULL);
}
cout << "Main: program exiting." << endl;
pthread_exit(NULL);
return 0;
//
}
`
这个程序应该从参数中读取3个文件,将行加载到向量中并按此顺序显示元素,以保持跟踪i仅打印索引而不是值:
0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
1 0 0
.....
例如,如果我输入一个文件,其中1000行作为array1,1行输入array2,1行输入array3,程序将显示2000行。问题是当我将线程数从1增加到2时,在显示3000行的No中,使用相同的文件作为输入。添加每个线程后,输出的行数增加1000。
我怀疑当线程匆忙时i_array2在某个时刻没有增加,但是我使用了初始化的互斥锁,正如我在其他问题中看到的那样。或者我会想念一些简单的事情,我知道实施它是一团糟。
谢谢!
修改: 我刚刚发现问题不在互斥体中,我在互斥锁和解锁之间只用打印和睡眠来测试程序,似乎线程正在等待彼此。因此,对于索引的增量,问题是奇怪的。我不知道那里有什么问题。
答案 0 :(得分:2)
此代码错误:
pthread_mutex_init(&count,PTHREAD_PROCESS_PRIVATE);
正确使用pthread_mutex_init()
,每t he POSIX documentation,
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
在您的代码中,那将是
pthread_mutex_init(&count,&attr);
启用编译器警告并注意它们。