递减信号量的错误在哪里?

Where is my error decrementing the semaphor?

我正在使用信号量。我有两个线程。第一个线程每两秒执行一个创建动态数组的循环。在循环开始时,它创建动态数组,并最终将其删除。另一方面,一个线程必须写入这个动态数组,显然前提是它已经被创建并且还没有被删除(即,在创建之后和删除之前)。我不知道如何正确使用信号量。我哪里做错了?感谢您的帮助!

int *array
int position = 0;
static void *thread_A(void *p_vp_arg)
{

    while (1)
    {
        sem_post(&sem);
        array = malloc(1024*sizeof(int));
        /* SOME STUFF HERE */
        sleep(2);
        free(array);
    }
}

static void function_B(...){
    if(sem_trywait(&sem)){
        printf("I can write into the array\n");
        array[position] = variable;
        position += 1;
    }
}

入主:

sem_init(&sem, 0, 0)

在你的数组减速中,你在分配数组之前执行 sem_post() 这实际上应该在它之后,在删除之前有一个 sem_wait() 因为现在你正在释放锁并允许另一个线程在它被分配之前尝试访问它。您也可以在另一个线程当前正在写入数组时删除它。

在写作方法中,我会切换到使用 sem_wait 而不是 sem_trywait,它将自行处理大部分等待。这是除非你有特定的理由使用 sem_trywait

也不要使用 sem_trywait() 的 sem 结果或任何 sem 作为循环条件,这可能会导致它失败。而是做

int result = sem_trywait(&sem)
if(result == 0){
    //rest of code

它 returns 0 成功和/或任何其他错误代码更多可以在 manual page 上阅读关于特定错误

最后,您永远不会释放写入线程中的锁,您需要在完成锁定后执行 sem_post(),因为现在您永远不会释放锁。