我正在尝试学习信号量和多线程。我正在使用的示例创建 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);
}