私のプログラムには sharedqueue
があり、大きく 2 つの部分に分かれています。
1 つはクラスのインスタンスを にプッシュrequest
するためのものqueue
で、もうrequest
1 つは 内の複数のオブジェクトにアクセスしてqueue
これらのオブジェクトを処理するためのものです。フィールドrequest
を持つ非常に単純なクラス(テスト用)です。string req
私は 2 番目の部分に取り組んでおり、そうする中で、 onescheduling thread
と multiple (私の例では two)を維持したいと考えていexecuting threads
ます。
別々にしたい理由は、 の数と複数でアクセスする操作をscheduling thread
減らすためです。lock
unlock
queue
executing threads
私はpthreadライブラリを使用しており、スケジューリングと実行関数は次のようになります。
void * sched(void* elem) {
queue<request> *qr = static_cast<queue<request>*>(elem);
pthread_t pt1, pt2;
if(pthread_mutex_lock(&mut) == 0) {
if(!qr->empty()) {
int result1 = pthread_create(&pt1, NULL, execQueue, &(qr->front()));
if (result1 != 0) cout << "error sched1" << endl;
qr->pop();
}
if(!qr->empty()) {
int result2 = pthread_create(&pt2, NULL, execQueue, &(qr->front()));
if (result2 != 0) cout << "error sched2" << endl;
qr->pop();
}
pthread_join(pt1, NULL);
pthread_join(pt2, NULL);
pthread_mutex_unlock(&mut);
}
return 0;
}
void * execQueue(void* elem) {
request *r = static_cast<request*>(elem);
cout << "req is: " << r->req << endl; // req is a string field
return 0;
}
簡単に言えば、それぞれに実行するスレッドが 1 つあり、パラメーターexecQueue
を介して渡された要求を出力するだけです。void* elem
sched
で、スレッドで呼び出されmain()
ます (どのように呼び出されるのか疑問に思っている場合は、main()
以下のように呼び出されます)。
pthread_t schedpt;
int schresult = pthread_create(&schedpt, NULL, sched, &q);
if (schresult != 0) cout << "error sch" << endl;
pthread_join(schedpt, NULL);
そして、sched
関数自体が から複数 (ここでは 2 つ)executing threads
とpop
sを作成request
し、複数のスレッド (pthread_create と次に ptrhead_join) を呼び出しqueue
て s を実行します。request
execQueue
問題は、プログラムによる奇妙な動作です。
スレッドを作成して複数のスレッドで呼び出すことなく、サイズとキュー内の要素を確認したところ、それらはまさに期待どおりでした。
ただし、複数のスレッドでプログラムを実行すると、出力されます
1 個のアイテムがキューに入っています。2 アイテムがキューに入っています。要件は: 要件は: FIRST! �(x'�j|1��rj|p�rj|1����FIRST!�'�j|!�'�j|�'�j| P��(�(��(1� ��i|p��i|
最後の行は常に変化しています。
望ましい出力は
1 個のアイテムがキューに入っています。2 アイテムがキューに入っています。要件は: FIRST 要件は: FIRST
execQueue
複数のスレッドで呼び出す方法、または間違っている方法のいずれかだと思いますがpop()
、問題を理解できず、正しい使用法を参照するソースも見つかりませんでした。
これについて私を助けてください。私は初心者なので、pthread の不器用な使用についてはご容赦ください。