【问题标题】:Posix Semaphores. Why will my threads not wait at sem_wait() like they're supposed to?Posix 信号量。为什么我的线程不会像他们应该的那样在 sem_wait() 等待?
【发布时间】:2013-10-10 23:35:42
【问题描述】:

有问题的代码是:

void insertIntoFinalArray(char * string) {
    sem_wait(&insert);
    if (finalarray == NULL) finalarray = (char **) malloc(sizeof(char *));
    else finalarray = (char **) realloc(finalarray, ((size_final + 1) * sizeof(char *)));

    finalarray[size_final] = (char *) malloc(sizeof(string) + 1);
    strcpy(finalarray[size_final], string);
    size_final++;
    sem_post(&insert);
}

insert 被初始化为 sem_init(&insert, 0, 0); 编辑:这应该是 sem_init(&insert, 0, 1) 我在搅动代码,只是没有将其设置回来……它不管用。

据我了解,线程应该在 sem_wait() 处等待,直到值大于零。但是,调试显示函数内有多个线程。

所以我只是不了解信号量的作用还是?

编辑:OS X 不支持未命名的信号量...但是,即使使用 insert = sem_open("insert", O_CREAT, 1); 也允许所有线程通过我的 sem_wait() 行。

【问题讨论】:

  • 你绝对确定你没有在代码中的其他地方发布,因为否则一开始就没有任何东西进入那里。顺便说一句,那是什么调试器?它来自 IDE 吗?
  • 我没有在其他地方发帖pastebin.com/Q1Pdi6bw
  • 如果它被初始化为零值,怎么会超过第一个sem_wait。这里有些可疑。我建议发布一个完整的程序来显示您的问题。
  • 哦,好吧,我认为this 是你的问题。关于调试器的评论让我想起了 osx。 Xcode 确实看起来不错。
  • 尝试使用“/insert”作为名称。并检查您的返回码。

标签: c pthreads posix semaphore


【解决方案1】:

感谢 Duck 帮助我。

Apple gcc 在 semaphores.h 中定义了 sem_init,但它返回 -1 - 它没有实现。也就是说,您不能有未命名的信号量。相反,请使用sem_open(name, options, initial value);

【讨论】:

    猜你喜欢
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 2018-03-19
    相关资源
    最近更新 更多