C言語にてこちらのサイトを参考にサーバへの非同期データ呼び出し処理を実装したいと思っています。中でも参考にしたのがOSSのスレッドプールで、このサイトにのっていたサンプルを参考にスレッドプールからデータ取得のAPI(ここではread_data())を呼び出し、非同期なデータ呼び出しプログラムを実装しました。しかし、結果の出力部分でバイトオーダが崩れる問題が発生してしまいます。結果の崩れ方は単純にバイトおーだが反転しているものや、そもそも値が崩れているものなど様々です。
read_data関数のエラーかと思いましたが、単一スレッドからread_data_indexesに対してread_dataを順番に呼び出した際にはこのようなことは起こらず、ちゃんと全ての結果が正しく確認できます。該当部分の自作クラスメソッド(クラス名はClientAPIです)を掲載いたします。
自身で色々調べたのですが、わからなかったためここに質問いたします。アドバイスをよろしくお願いいたします。(C言語の素人エンジニアなので書き方や使い方とうおかしいところがあるかもしれません。)
C++
1/*該当部分のコード*/ 2 vector<int> read_data_indexes = [0,1,2,3,4,5,6,7,8,9,10,11,12....200]; 3 vector<future<vector<struct data_list>>> *results; 4 ClientAPI *api = this; /*該当部分はClientAPI内部に実装されているので、clientAPI自身をthisで与える*/ 5 6 for(auto itr = read_data_indexes.begin(); itr != read_data_indexes.end(); ++itr) { 7 int tmp = *itr; 8 results->emplace_back( 9 this->pool->enqueue([tmp, api] { 10 struct data_list* result_list; 11 int result_num = 0; 12 vector<struct data_list> result_vector; 13 /* read_data(索引, 結果のリスト) にてサーバよりデータを取得、内部でホストオーダー<->ネットオーダー変換を実行 */ 14 result_num = api->read_data(tmp, result_list); 15 for(int i = 0; i < result_num; i++) { 16 return_vector.push_back(result_list[i]); 17 } 18 delete result_list; 19 return result_vector; 20 }) 21 ); 22 } 23 /*結果の出力*/ 24 for(auto && result: results) { 25 vector<struct data_list> tmp = result.get(); 26 for(auto itr = tmp.begin(); itr != tmp.end(); ++itr) { 27 printf("data == %d\n", *itr); 28 } 29 } 30
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。