我在将分段错误发布到信号灯上。实际崩溃在此行上:
sem_post(flag);
这是我正在使用的代码:
//global variable for the use of all threads:
sem_t *flag= NULL;
//in main,before creating the threads:
sem_init(flag,0,1);
//in function of the threads :
sem_post(flag);
我也尝试仅使用全局信号量-代替-指向信号量的指针。我该如何解决?
答案 0 :(得分:2)
我相信您正在使用sem_t *
类型,这是合理但不正确的。与其让信号量本身为sem_t *
,而是意味着“我不是sem_t
,但我可以告诉您信号量在哪里,”您希望该信号量具有类型{{1 }}。
因此,当您致电sem_t
时,您需要传递信号量的地址,如下所示:
sem_init
类似地,要发布到信号量,您将要写
sem_init(&flag, 0, 1);
让我们与您现在正在做的事情形成对比。通过将sem_post(&flag);
设为指向flag
的{{1}},您的意思是“我指向一个信号量,除了我实际上没有指向一个。”调用sem_t *
并传入空指针是一个错误-这意味着“请在空指针所指向的位置构造一个信号灯”,这在语义上是错误的。之所以发生崩溃,是因为您在说类似的话“请张贴到此空指针指向的信号量上”。通过转而拥有一个诚实至善的信号灯对象,然后将其传递给函数,您的意思是“这是我的信号灯-请用它做些好事。”