我正在嘗試瞭解信號量和多線程。我正在使用的示例創建1到t個線程,每個線程指向下一個線程,最後一個線程指向第一個線程。這個程序允許每個線程順序地輪流,直到所有的線程都轉了n圈。那是程序結束的時候。唯一的問題是在tFunc函數中,我正在等待,直到它是一個特定的線程。我想知道如何使用信號燈,以便讓所有線程只有在輪到執行以提高效率時才進入睡眠狀態並喚醒線程。C++使用信號量而不是忙等待
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);
}
'while(turn!= data-> me){}'?? – sje397
C++數組基於零 - 'for(int i = 1; i <= t; i ++)'將超出數組邊界。 – sje397
它只是循環直到輪到它。我只在網上找到了簡單的信號燈示例,並試圖實現它...但我認爲我需要多個信號量,現在我正在試圖圍繞如何實現它的過程中失去自己的頭腦。 – user1378863