0

CPP のスレッド ライブラリと Intel TBB Library for MultiCore を使用した 1 つのアルゴリズムを実装しています。スレッドの助けを借りて関数を呼び出しているときに、完全に実行されることもあれば、実行時に例外が発生することもあります。原因を見つけようとしています。が見つかりませんでした。例外が発生しているコード スニペットの例を見つけてください。

#include <iostream> 
#include <sstream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <tbb/pipeline.h>
#include <tbb/atomic.h>
#include <tbb/concurrent_queue.h>
#include <tbb/compat/thread>
#include <tbb/tbbmalloc_proxy.h>    
using namespace std;
using namespace tbb;

#define pi 3.141593
#define FILTER_LEN  265


class MyBuffer 
{
    public:
    double *acc;
    double *buffer;
    int start,end;


    MyBuffer()
    {
        start=0;
        end=0;

       buffer=new double[150264];
       acc=new double[150000];
       fill_n(buffer,150264,0);

    }

    ~MyBuffer()
    {
        delete[] buffer;
        delete[] acc;
    }
    int startnumber()
    {
        return start;
    }
    int endnumber()
    {
        return end;
    }
};




typedef concurrent_queue<MyBuffer>  QueueMyBufferType;
QueueMyBufferType chunk_queue;

atomic<bool> stop_flag;

// input function that will be running by thread to generate sinewave

void input_function()                               
{   
   stop_flag = false;     

   cout<<"thread reached to call input function " <<endl;

   ofstream o("testing sinewave.csv");

   int counter=0;
   while(counter<150000)    
  { 
        cout<<"value of counter is \t" <<counter << endl;
        //MyBuffer *b=new MyBuffer;                                                     
        MyBuffer b; 
        b.start=(FILTER_LEN-1+(counter));
        b.end=(25264+(counter));

        cout<<"value of b.start is and b.end is "<<b.start<<"\t" <<b.end<<endl;

        for(int i =b.startnumber(); i <b.endnumber(); i++)
         {
                b.buffer[i] = sin(700 * (2 * pi) * (i / 5000.0));
                o<<b.buffer[i]<<endl;   
         }

         chunk_queue.push(b);
         cout<<"object pushed in queue and value of j is \t" <<counter <<endl;
         counter+=25000;
     }

    stop_flag = true;
     cout<<"all data is perfectly generated" <<endl;
}


int main()
{
    thread input_thread(input_function);

    while(!stop_flag)
    {
        //cout<<"waiting for thread " << endl;
    }
    cout << "\n All Data is processed \n\n" << endl;        

    return 0;
}

このコードはアプリケーションの一部であり、正弦波の生成に役立ちます。間違っている場所を見つけるのを手伝ってください。

4

1 に答える 1

1

の :

b.end=(25264+(MyBuffer::j));

25264+(MyBuffer::j)メンバー配列の境界を超える可能性がありますbuffer

バウンドチェックのMyBuffer::j<150000可能性がありますMyBuffer::j<150000-25264

while(counter<150000-25264)    
  {  ... }
于 2013-05-31T06:12:32.090 に答える