我正在使用array
2个帖子。一个是写它和另一个阅读。你可以假设阅读比写作慢。读者和作者是分开的pthreads
。据我所知,在这些线程之间共享array
作为全局变量是安全的。
所以整体情况如下:
char ** array;
void writer(void){
for (unsigned long i = 0; i < maxArraySize; i++){
array[i] = malloc(someSize);
array[i] = someCharArray;
}
void reader(void){
for (unsigned long i = 0; i < maxArraySize; i++){
if(array[i] == NULL){ // in case reader is faster
i--;
continue;
}
useData(array[i]);
free(array[i]); // HERE IS MY QUESTION..
}
main(){
array = malloc(maxArraySize);
pthread_t reader, writer;
pthread_create( &reader, NULL, reader, NULL);
pthread_create( &writer, NULL, writer, NULL);
}
我的问题与我释放第一个数组元素的行有关。这样做是否安全?因为当我释放第i个元素时,同时写入是写入数组。因此可能会出现写入器错误地址的情况,因为它会丢失头指针吗?
答案 0 :(得分:3)
如果在没有特殊指令的情况下读取期间读取结果未定义,则不安全。您可以获得任何值,但您不太可能看到除NULL或已分配的任何值。
正如其他人在评论中提到的那样,未初始化的数组可能包含任何内容(它是未定义的),尽管它可能在内核提供给你之前归零。
如果您需要安全性,则需要锁定机制,例如信号量(http://man7.org/linux/man-pages/man3/sem_init.3.html)。
char ** array;
// Allows access while non zero
sem_t sem;
void writer(void){
for (unsigned long i = 0; i < maxArraySize; i++){
array[i] = malloc(someSize);
array[i] = someCharArray;
// Increment semaphore.
sem_post(&sem);
}
void reader(void){
for (unsigned long i = 0; i < maxArraySize; i++){
// Will return -1 if the semaphore is not at zero
// Will return 0 if semaphore is greater than zero and decrement it.
if(sem_trywait(&sem)){ // in case reader is faster
i--;
continue;
}
useData(array[i]);
free(array[i]); // HERE IS MY QUESTION..
}
main(){
// Initialize semaphore to zero
sem_init(&sem, 0 , 0);
// Initialize array to have maxArraySize elements.
array = malloc(maxArraySize * sizeof(*array));
pthread_t reader, writer;
pthread_create( &reader, NULL, reader, NULL);
pthread_create( &writer, NULL, writer, NULL);
}
这应该很快,但会在sem_trywait
处旋转你的cpu做很多事情。如果您可以再等一会儿并且不需要旋转,请使用sem_wait
。
我还更正了malloc语句中的错误,因为它没有为maxArraySize
char *
个项目分配足够的空间。