n個のタスクがあるタスクスケジューラを実装しようとしています。私のタスクスケジューラの背後にある考え方は、ベクトルのキューのループでは、タスクはキューのループの中で最も短いキューにエンキューされる必要があるということです。これは、次のコードによって実行されます。
#include <vector>
#include <queue>
std::vector<std::queue<int> > q
int min_index = 0;
task t // implemented in the other part of the program
std::size_t size = q.size();
for( i=0; i<size; i++){ //accessing loop of queues
if(q[min_index].size() > q[i].size())
min_index = i; // Now q[min_index] is the shortest queue
}
q[min_index].push(Task);
次に、このパラダイムを拡張してスケジューラーのオーバーヘッド時間を削減しようとしています。毎回最短のキューを検索する代わりに、何らかの条件を検索します。5つのタスクが最短キューにエンキューされた後、最短キューを検索します。
私はこのようなことをする必要があります
#include <vector>
#include <queue>
std::vector<std::queue<int> > q
task t // implemented in the other part of the program
while(q[min_index].size()!=q[min_index].size()+5) // check whether current min_index queue's size is increased 5 more times if not goto enqueue
{
goto enqueue;
}
int min_index = 0;
std::size_t size = q.size();
for( i=0; i<size; i++){ //accessing loop of queues
if(q[min_index].size() > q[i].size())
min_index = i; // Now q[min_index] is the shortest queue
}
enqueue:
q[min_index].push(Task);
誰かがそれを正しく進める方法を教えてもらえますか?前もって感謝します
更新 5(乱数)の代わりに、信頼性が高く、毎回概算する数を使用することを考えました。そこで、キューのループのmin_valueサイズとmax_valueサイズの差を取得し、毎回カウンターと比較することを考えました。
// global variables
std::vector<std::queue<int> > q;
int counter = INT_MAX; //
int min_index = 0;
int max_size = -1;
void enqueue(scheduler::task new_task) {
if ( counter > diff_size ){
// look for new min and maximum
std::size_t size = q.size();
for( i=0; i<size; i++){
if(q[min_index].size() > q[i].size())
min_index = i;
if(q[i].size() > max_size)
max_size = q[i].size();
diff_size=max_size - min_index;
}
// counter reset
counter = 0;
}
// enqueue in minimum queue
q[min_index].push(new_task)
// increase counter
counter ++;
}