linux 信号量问题 编译错误 好像不识别sem_t定义的变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 信号量问题 编译错误 好像不识别sem_t定义的变量相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include<pthread.h>
#include<semaphore.h>
#include<unistd.h>

sem_t *in; sem_init(in,0,1)
sem_t *out; sem_init(out,0,1)
sem_t *handout; sem_init(handout,0,0)
sem_t *handin; sem_init(handin,0,0)
sem_t *goout; sem_init(goout,0,0)

int counter=0;

void * studentIn(void *a)

sem_wait(in);
counter++;
printf("%d\n",counter);
if(counter==30)

sem_post(handout);
return NULL;

sem_post(in);
return NULL;


void * fteacherhandout(void *b)

sem_wait(handout);
printf("teacher said:hand out over\n");
sem_post(handin);
return NULL;


void * studentout(void *c)

sem_wait(handin);
sem_wait(out);
counter--;
printf("%d\n",counter);
if(counter==0)

sem_post(goout);
return NULL;

sem_post(out);

void * fteacherout(void *d)

sem_wait(goout);
printf("teacher go out");
return NULL;


void main()


int i=0;
pthread_t thread1[30],thread2[30],teacher1,teacher2;
pthread_attr_t attr;
pthread_attr_init(&attr);
for(i=0;i<30;i++)

pthread_create(&thread1[i],&attr,studentIn,NULL);


for(i=0;i<30;i++)

pthread_create(&thread2[i],&attr,studentout,NULL);


pthread_create(&teacher1,&attr,fteacherhandout,NULL);

pthread_create(&teacher2,&attr,fteacherout,NULL);

return ;


错误:b.c:18:6: note: each undeclared identifier is reported only once for each function it appears in
b.c:22:21: error: ‘handout’ undeclared (first use in this function)
b.c: In function ‘fteacherhandout’:
b.c:31:16: error: ‘handout’ undeclared (first use in this function)
b.c:33:16: error: ‘handin’ undeclared (first use in this function)
b.c: In function ‘studentout’:
b.c:39:17: error: ‘handin’ undeclared (first use in this function)
b.c:40:17: error: ‘out’ undeclared (first use in this function)
b.c:41:8: error: ‘counter’ undeclared (first use in this function)
b.c:45:23: error: ‘goout’ undeclared (first use in this function)
b.c: In function ‘fteacherout’:
b.c:52:16: error: ‘goout’ undeclared (first use in this function)

参考技术A 帮你修改了一下,编译运行没问题,修改的地方都标出来了,
由于不知道你程序的功能,所以没有对你的程序逻辑进行分析

#include <stdio.h>
#include<pthread.h>
#include<semaphore.h>
#include<unistd.h>
//----------------以下是修改的部分
sem_t in;
sem_t out;
sem_t handout;
sem_t handin;
sem_t goout;
//----------------

int counter=0;

void * studentIn(void *a)

sem_wait(&in);//修改
counter++;
printf("%d\n",counter);
if(counter==30)

sem_post(&handout);//修改
return NULL;

sem_post(&in);//修改
return NULL;


void * fteacherhandout(void *b)

sem_wait(&handout);//修改
printf("teacher said:hand out over\n");
sem_post(&handin);//修改
return NULL;


void * studentout(void *c)

sem_wait(&handin);//修改
sem_wait(&out);//修改
counter--;
printf("%d\n",counter);
if(counter==0)

sem_post(&goout);//修改
return NULL;

sem_post(&out);//修改

void * fteacherout(void *d)

sem_wait(&goout);//修改
printf("teacher go out");
return NULL;


void main()


int i=0;
//----------------以下是修改的部分
sem_init(&in,0,1);
sem_init(&out,0,1);
sem_init(&handin,0,0);
sem_init(&handout,0,0);
sem_init(&goout,0,0);
//----------------
pthread_t thread1[30],thread2[30],teacher1,teacher2;
pthread_attr_t attr;
pthread_attr_init(&attr);
for(i=0;i<30;i++)

pthread_create(&thread1[i],&attr,studentIn,NULL);


for(i=0;i<30;i++)

pthread_create(&thread2[i],&attr,studentout,NULL);


pthread_create(&teacher1,&attr,fteacherhandout,NULL);

pthread_create(&teacher2,&attr,fteacherout,NULL);

return;

奇怪的 POSIX 信号量行为(卡在 Linux 上的 sem_wait 上)

【中文标题】奇怪的 POSIX 信号量行为(卡在 Linux 上的 sem_wait 上)【英文标题】:Strange POSIX semaphore behavior (stuck on sem_wait on Linux) 【发布时间】:2019-10-11 22:58:35 【问题描述】:

我正在尝试解决一个涉及 POSIX 信号量的学校问题。我遇到了一个问题,我已将其范围缩小到此简化代码:

sem_t sem;

void parent() 
    printf("waiting...\n");
    sem_wait(&sem);
    printf("done!\n");


void child() 
    sem_post(&sem);
    printf("go!\n");
    exit(0);


int main() 
    sem_init(&sem, 1, 0);

    if(!fork())
        child();

    parent();

    sem_destroy(&sem);

    exit(0);

在 Linux 中编译(使用gcc -Wall -pthread sems.c -o sems)并运行此程序时,我得到以下输出(程序未完成执行):

waiting... 
go!

因为我在子进程中调用sem_post(&amp;sem),所以我希望父进程越过sem_wait(&amp;sem),输出为:

waiting...
go!
done!

更奇怪的是,出于好奇,我尝试使用 CLion(Cygwin 编译器)在 Windows 上对其进行测试,并且程序按预期运行。我在这里错过了什么?

【问题讨论】:

【参考方案1】:

来自man page of sem_init()

如果 pshared 不为零,则信号量在进程之间共享,并且应该位于共享内存区域中(请参阅 shm_open(3)、mmap(2) 和 shmget(2))。 (由于 fork(2) 创建的子代继承了其父代的内存映射,它也可以访问信号量。)

您的sem 变量未在共享内存中分配;因此,尽管pshared 参数不为零,但它不能在进程之间共享。每个进程都有自己独特的信号量实例。

【讨论】:

@cabralpinto Cygwin 做了各种奇怪的事情来尝试解决 Windows 缺乏与 fork() 等等效项的问题。毫不奇怪,它的行为与真正的 Linux 或 Unix 环境不同。 在这种情况下,posix semaphore api 看起来像是在原生 Win32 信号量之上的一个薄包装器,它在某些事情上有微妙的不同语义。

以上是关于linux 信号量问题 编译错误 好像不识别sem_t定义的变量的主要内容,如果未能解决你的问题,请参考以下文章

怎么修改linux中sem的值

奇怪的 POSIX 信号量行为(卡在 Linux 上的 sem_wait 上)

关于 C Linux 中命名信号量的疑问

linux信号量的问题

Linux C语言 信号量 sem_init() sem_wait() sem_timedwait() sem_post() sem_destroy()

Linux C语言 信号量 sem_init() sem_wait() sem_timedwait() sem_post() sem_destroy()