多线程与pthread小问题

时间:2018-04-15 00:37:24

标签: c++ multithreading pthreads

我有一个应该迭代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在某个时刻没有增加,但是我使用了初始化的互斥锁,正如我在其他问题中看到的那样。或者我会想念一些简单的事情,我知道实施它是一团糟。

谢谢!

修改: 我刚刚发现问题不在互斥体中,我在互斥锁和解锁之间只用打印和睡眠来测试程序,似乎线程正在等待彼此。因此,对于索引的增量,问题是奇怪的。我不知道那里有什么问题。

1 个答案:

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

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