gpt4 book ai didi

c++ - 多线程与 pthread 小问题

转载 作者:行者123 更新时间:2023-11-28 01:34:41 25 4
gpt4 key购买 nike

我有一个函数应该遍历 3 个字符串 vector 。我实现的线程函数是这样的:

    #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 个文件将行加载到 vector 中并按此顺序显示元素,为了跟踪我只打印索引而不是值:
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 行的地方,使用相同的文件作为输入。每添加一个线程,输出的行数就会增加 1000。我怀疑 i_array2 在线程匆忙时的某个时刻没有增加,但我使用了一个初始化的互斥体,正如我在其他问题中看到的那样。还是我错过了一些简单的事情,我知道它的实现一团糟。

谢谢!

编辑:我刚刚发现问题不在互斥体中,我测试了程序,只在互斥体锁定和解锁之间打印和 sleep ,似乎线程正在互相等待。因此,随着索引的增加,问题有些奇怪。我不明白那里出了什么问题。

最佳答案

这段代码是错误的:

   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);

启用编译器警告并注意它们。

关于c++ - 多线程与 pthread 小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49837472/

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