【发布时间】:2014-04-29 05:37:07
【问题描述】:
我在1.txt, 2.txt ... 100.txt等文本文件中写了一个不同值(100次)的C结构
我在 Linux 上使用英特尔 TBB。我已经创建了:
- InputFilter (serial_in_order MODE)
- TransformFIlter (serial_in_order 模式)
- OutputFilter(Serial_in_order 模式)
InputFilter 从文件中读取结构并将其传递给 TransformFilter。 TrasnformFilter 更新结构值并将其传递给 OutputFilter。 OutputFilter 将新结构写入光盘。
基本上,它是一个结构体的简单读写应用程序。
class InputFilter: public tbb::filter {
public:
InputFilter( int );
~InputFilter();
private:
int total_streams;
int count;
struct video_process_object input_obj;
void* operator()( void* );
};
InputFilter::InputFilter( int x )
: filter( serial_in_order ) {
total_streams = x;
count = 1;
}
InputFilter::~InputFilter() {
total_streams = 0;
}
void* InputFilter::operator()( void* ) {
char path[50] = { };
sprintf( path, "input//%d.txt", count );
printf( "Path : %s\n", path );
FILE *fp;
fp = fopen( path, "r" );
if( fp == NULL || count > total_streams ) {
fclose( fp );
printf( "\n*******Cannot find more data.Terminating********\n\n\n" );
return NULL;
}
fscanf( fp, "%d", &input_obj.video_id );
fscanf( fp, "%s", &input_obj.storage_url );
fscanf( fp, "%s", &input_obj.storage_type );
fscanf( fp, "%d", &input_obj.face_detect );
fscanf( fp, "%d", &input_obj.face_recognise );
fscanf( fp, "%d", &input_obj.scene_recognise );
fscanf( fp, "%d", &input_obj.activity_recognise );
fscanf( fp, "%d", &input_obj.speech_recognise );
fclose( fp );
count++;
return &input_obj;
}
class TransformFilter: public tbb::filter {
public:
TransformFilter();
~TransformFilter();
private:
struct video_process_object input_transform;
void* operator()( void* );
};
TransformFilter::TransformFilter()
: filter( serial_in_order ) {
}
TransformFilter::~TransformFilter() {
}
void* TransformFilter::operator()( void *item ) {
input_transform = *static_cast<struct video_process_object*>( item );
input_transform.video_id += 1000;
strcat( input_transform.storage_url, " nabeel" );
strcat( input_transform.storage_type, " N" );
input_transform.face_detect += 1000;
input_transform.face_recognise += 1000;
return &input_transform;
}
class OutputFilter: public tbb::filter {
public:
OutputFilter();
~OutputFilter();
private:
struct video_process_object output_obj;
void* operator()( void* );
};
OutputFilter::OutputFilter()
: filter( serial_in_order ) {
int status = mkdir( "output", S_IRWXU | S_IRWXG | S_IRWXO );
if( status == -1 )
printf( "\nOutput directory already exists\n\n" );
}
OutputFilter::~OutputFilter() {
}
void* OutputFilter::operator()( void *item ) {
output_obj = *static_cast<struct video_process_object*>( item );
FILE *fp;
char path[50] = { };
sprintf( path, "output//%d.txt", output_obj.video_id - 1000 );
printf( "Output Path : %s\t\t %d\n\n", path, output_obj.video_id );
if( (fp = fopen( path, "w" )) == NULL ) {
fprintf( stderr, "Cannot open output file.\n" );
return NULL;
}
fprintf( fp, "%d\n", output_obj.video_id );
fprintf( fp, "%s\n", output_obj.storage_url );
fprintf( fp, "%s\n", output_obj.storage_type );
fprintf( fp, "%d\n", output_obj.face_detect );
fprintf( fp, "%d\n", output_obj.face_recognise );
fprintf( fp, "%d\n", output_obj.scene_recognise );
fprintf( fp, "%d\n", output_obj.activity_recognise );
fprintf( fp, "%d\n", output_obj.speech_recognise );
fclose( fp );
return NULL;
}
int main() {
tbb::pipeline pipeline;
InputFilter input_filter( 100 );
pipeline.add_filter( input_filter );
TransformFilter transform_filter;
pipeline.add_filter( transform_filter );
OutputFilter output_filter;
pipeline.add_filter( output_filter );
tbb::tick_count t0 = tbb::tick_count::now();
tbb::task_scheduler_init init_parallel;
pipeline.run( 1 );
tbb::tick_count t1 = tbb::tick_count::now();
return 0;
}
对于少量文件(例如 5 或 10)一切正常。当我读取大量文件(例如 50 或 100)时,问题就开始了。问题是:
有时 InputFilter 会读取 10.txt 文件,TransformFilter 会对其进行处理。但是 InputFilter 立即读取 11.txt。 OutputFIlter 跳过 10.txt 并处理 11.txt。
我如何确保不会发生这种情况?
【问题讨论】:
-
问题(如果有)在过滤器定义中。请将它们添加到代码中。另外,您指定了tokens=1,这意味着串行执行,是有意的吗?并请修正缩进(删除'主程序的代码'之前的空格)
-
不,我尝试使用不同数量的令牌。它不起作用,这就是为什么我最后尝试使用一个。 .我附上了完整的代码
-
我还意识到了一件事。 .我修复了我的代码。现在它与串行执行工作正常。虽然它不适用于并行执行,例如如果我使用的令牌超过 1。
标签: c++ multithreading parallel-processing tbb