我是使用posix-threads的新手。那麼,我寫了一個C程序,它創建了兩個線程。我有一個全局變量,它是一個傳感器值的數組。 thread1應該把值寫入這個數組中。線程2應在線程1完成寫入後讀取傳感器值。我的程序沒有顯示預期的行爲。線程1應該一次寫入500個值。但是,thread1並沒有完成一次寫入這500個值,線程2開始讀取損壞的值。我使用了互斥鎖,但它不能幫助我。線程1應該在所有情況下完成寫這500個值。它不應該被中斷,以便線程2可以讀取實際/正確的值。這是我的整個代碼:如何讓thread2在c中使用posix-threads等待thread1
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
int sensors_values[500];
pthread_mutex_t lock;
void *writeSensorValues (void * msg) {
pthread_mutex_lock(&lock);
printf("%s\n", (char*)msg);
for (int i=0; i<500; i++) {
sensors_values[i] = i;
}
pthread_mutex_unlock(&lock);
return NULL;
}
void *readSensorValues (void *msg) {
pthread_mutex_lock(&lock);
printf("%s:", (char*) msg);
for (int i=0; i<500; i++) {
printf(" %d",sensors_values[i]);
}
printf("\n");
pthread_mutex_unlock(&lock);
return NULL;
}
int main() {
pthread_t thread1,thread2;
char * msg1 = "thread1";
char * msg2 = "thread2";
memset(sensors_values,-1,500);
pthread_mutex_init(&lock,NULL);
pthread_create(&thread1,NULL,writeSensorValues, (void*)msg1);
pthread_create(&thread2,NULL,readSensorValues, (void*)msg2);
pthread_join(thread1,NULL);
pthread_join(thread2,NULL);
return 0;
}
我應該怎麼做才能獲得預期的行爲?
不能保證作者會在讀者之前鎖定互斥鎖。您可能需要使用一個或兩個信號量。 – EOF
另外memset(sensors_values,-1,500);'應該是'memset(sensors_values,-1,500 * sizeof(int));' – Dmitri
爲了擴展「使用信號量」的概念,這裏最簡單的方法是讓'readSensorValues'函數在讀取傳感器值之前執行'sem_wait',並且'writeSensorValues'函數執行'sem_post'。用'sem_init'將初始值設置爲0。如果你希望這兩個函數是「交錯」的,你可以拋棄這個互斥體,併爲每個循環迭代做一個單獨的帖子/等待。無論哪種方式,您都有一個經典的生產者/消費者問題,其中單一的信號量是最基本的解決方案。 –