OpenMp-处理单阵列

时间:2018-12-25 05:01:02

标签: c++ multithreading openmp

我有一个多线程应用程序(OpenMP),其中每个线程都进行一些计算并找到_pre的值。     然后,打开一个名称为“ file_pre.txt”的文件,并写入从索引_sub和_end开始的字符串部分。     具有相同文件名的两个线程不会打开该文件进行写入。     因此,我在关键部分编写了写作部分,但是它很昂贵,因为我希望多个具有不同文件名的线程能够同时写入各个文件,并且仅当它们在_pre中具有相同的值(相同的文件名)时才将它们锁定(更新线程可以等待其他线程完成)。

有人可以解决吗?

密码部分:

ofstream outfile;
#pragma omp parallel for num_threads(8) schedule(static) private(it) shared(array)
for (it = 0; it < array.size(); ++it) 
{
            int _pre, _sub = 0, _end;
             if(---)
            {        
                    _pre = xyz;
                                    _end = abc;
                                    ostringstream strCounter;
                                    strCounter << _pre;
                                    string result = "file" + strCounter.str() + ".txt";
                    #pragma omp critical(outfile)
                                        {
                                        outfile.open(result.c_str(), std::ios_base::app);
                                        if (outfile.is_open()) 
                                            {
                                            for (int count = _sub; count < _end; count++) 
                                            {
                                                outfile << buffer[count];
                                            }
                                            outfile << "\n";
                                            outfile.close();
                                           } else cout << "Unable to open file";
                                        _sub = _abc;
                    }
            }
            else
            {
                    _pre = _xyz_;
                                    _end = _abc_;
                                    ostringstream strCounter;
                                    strCounter << _pre;
                                    string result = "file" + strCounter.str() + ".txt";
                    #pragma omp critical(outfile)
                                        {
                                        outfile.open(result.c_str(), std::ios_base::app);
                                        if (outfile.is_open()) 
                                            {
                                            for (int count = _sub; count < _end; count++) 
                                            {
                                                outfile << buffer[count];
                                            }
                                            outfile << "\n";
                                            outfile.close();
                                           } else cout << "Unable to open file";
                                        _sub = _abc;
                    }

            }

}

0 个答案:

没有答案