【问题标题】:Where is my error decrementing the semaphor?我减少信号量的错误在哪里?
【发布时间】:2021-09-24 07:16:33
【问题描述】:

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

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)

【问题讨论】:

    标签: arrays c semaphore


    【解决方案1】:

    在您对数组进行减速时,您在分配数组之前执行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
    

    成功时返回 0 或其他任何错误代码,可以在 manual page 上阅读有关特定错误的更多信息

    最后你永远不会释放写线程中的锁,当你完成锁时你需要做sem_post(),因为现在你永远不会释放锁。

    【讨论】:

    • 问题是线程没有按照我的意愿使用信号量。我希望线程 A 在创建和删除操作期间阻塞信号量,但它不起作用。
    • @ReportFeedback 是的,这就是为什么正如我所说,在分配释放之前不要使用sem_post 释放锁,然后在释放阵列之前使用sem_wait 重新获得锁。然后它会在循环并重新制作数组时再次解锁
    猜你喜欢
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 2022-01-11
    • 2021-01-22
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多