セマフォとマルチスレッドについて学習しようとしています。私が取り組んでいる例では、各スレッドが次のスレッドを指し、最後のスレッドが最初のスレッドを指している 1 から t のスレッドを作成します。このプログラムは、すべてのスレッドが n 回転するまで、各スレッドが順番に回転できるようにします。それはプログラムが終了するときです。唯一の問題は tFunc 関数にあります。私は特定のスレッドの番になるまで待つのに忙しいのです。セマフォを使用してすべてのスレッドをスリープ状態にし、実行する番になったときにのみスレッドを起動して効率を向上させる方法を知りたいです。
int turn = 1;
int counter = 0;
int t, n;
struct tData {
int me;
int next;
};
void *tFunc(void *arg) {
struct tData *data;
data = (struct tData *) arg;
for (int i = 0; i < n; i++) {
while (turn != data->me) {
}
counter++;
turn = data->next;
}
}
int main (int argc, char *argv[]) {
t = atoi(argv[1]);
n = atoi(argv[2]);
struct tData td[t];
pthread_t threads[t];
int rc;
for (int i = 1; i <= t; i++) {
if (i == t) {
td[i].me = i;
td[i].next = 1;
}
else {
td[i].me = i;
td[i].next = i + 1;
}
rc = pthread_create(&threads[i], NULL, tFunc, (void *)&td[i]);
if (rc) {
cout << "Error: Unable to create thread, " << rc << endl;
exit(-1);
}
}
for (int i = 1; i <= t; i++) {
pthread_join(threads[i], NULL);
}
pthread_exit(NULL);
}