我是使用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。如果你希望这两个函数是“交错”的,你可以抛弃这个互斥体,并为每个循环迭代做一个单独的帖子/等待。无论哪种方式,您都有一个经典的生产者/消费者问题,其中单一的信号量是最基本的解决方案。 –