导航:首页 > 网络营销 > linuxseminit

linuxseminit

发布时间:2020-08-16 23:54:53

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

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

#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;
}

2、linux中有什么函数可替代waitForSingleObject

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

Windows中的WaitForSingleObject()函数对应在Linux中的sem_wait(),SetEvent对应sem_post(),
参考下面的Linux程序:
#include
#include
#include
#include
#include
#include
char tem[10]; //读写公共区
sem_t sem;
void* thread_fun(void*);
int main()
{
int counter=0;
pthread_t mythread;
sem_init(&sem,0,0);
pthread_create(&mythread,NULL,thread_fun,NULL);
while(counter<10) //往读写区里写10次'f'
{
tem[counter]='f';
counter++;
sem_post(&sem);
}
pthread_join(mythread,NULL); //等待子线程
sem_destroy(&sem);
exit(0);
}
void* thread_fun(void* arg) //子线程函数
{
int counter=0;
while(counter<10&&sem_wait(&sem)==0)
{
printf("%c",tem[counter]); //读出来显示
counter++;
//sem_wait(&sem);
}
pthread_exit(NULL);
}

3、linux下怎样实现WaitForSingleObject的功能

windows的WaitForSingleObject这个接口超级混乱,
等线程用 pthread_join,
等semphore用 sem_wait
等mutex用 pthread_mutex_lock
windows偏要做大而全, 让人很无奈.

4、急!LINUX下,GCC编译,原程序包含<semaphore.h>头文件,为什么编译时说sem_wait,sem_post等未定义的引用

编译时加上参数:-lpthread

要看报错的阶段,是在编译还是链接阶段.
如果编译时函数没有找到,那是头文件的问题,如果链接时未定义引用,那是c库的问题.
如果你的头文件都正常包含了,那可能你的c库没有使能semaphore的支持.

5、linux编程时的信号量问题。 我以前用过的信号量头文件是<semaphore.h>,而现在又发现还有个<sys/sem.h>

信号量在进程是以有名信号量进行通信的,在线程是以无名信号进行通信的,因为线程linux还没有实现进程间的通信,所以在sem_init的第二个参数要为0,而且在多线程间的同步是可以通过有名信号量也可通过无名信号,但是一般情况线程的同步是无名信号量,无名信号量使用简单,而且sem_t存储在进程空间中,有名信号量必须LINUX内核管理,由内核结构struct ipc_ids 存储,是随内核持续的,系统关闭,信号量则删除,当然也可以显示删除,通过系统调用删除,
消息队列,信号量,内存共享,这几个都是一样的原理。,只不过信号量分为有名与无名

无名使用 <semaphore.h>,
有名信号量<sys/sem.h>
无名信号量不能用进程间通信,
//无名与有名的区别,有名需要KEY值与IPC标识
所以sem_init的第二个参数必须为0,,,,

6、Linux下的信号量源码在那里可以看到

在linux源代码里面的一个目录里面。
建议你去www.oldlinux.org.去看赵炯的那本《linux内核分析...

7、linux 怎么查 信号量 被进程p住

sem_init:初始化信号量sem_t,初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享。
sem_wait:一直阻塞等待直到信号量>0。
sem_timedwait:阻塞等待若干时间直到信号量>0。
sem_post:使信号量加1。
sem_destroy:释放信号量。和sem_init对应。 答案补充 关于各函数的具体参数请用man查看,如man sem_init可查看该函数的帮助

信号量的工作原理
由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:
P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行
V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1.

举个例子,就是两个进程共享信号量sv,一旦其中一个进程执行了P(sv)操作,它将得到信号量,并可以进入临界区,使sv减1。而第二个进程将被阻止进入临界区,因为当它试图执行P(sv)时,sv为0,它会被挂起以等待第一个进程离开临界区域并执行V(sv)释放信号量,这时第二个进程就可以恢复执行。

Linux的信号量机制
Linux提供了一组精心设计的信号量接口来对信号进行操作,它们不只是针对二进制信号量,下面将会对这些函数进行介绍,但请注意,这些函数都是用来对成组的信号量值进行操作的。它们声明在头文件sys/sem.h中。

8、关于linux下的多线程使用sem信号量的运行问题

不是信号量的问题
printf函数,是先写到输出缓冲,遇到\n时,或者缓冲区满时,或者有强制输出(fflush)时,才会将缓冲区里的内容输出到屏幕上(标准输出设备:stdout)。你的代码里面并没有以上3个触发条件的任意一种,所以printf的内存没有实际输出到屏幕上。
你只要在每个printf函数后面加上fflush(stdout);就可以了。

9、linux c中,信号量怎么声明

sem_t是linux下的信号量

头文件:

#include <semaphore.h>

初始化
int sem_init (sem_t *sem, int pshared, unsigned int value);

激活:
int sem_post(sem_t *sem);

等待:
int sem_wait(sem_t * sem);
int sem_trywait(sem_t *sem);
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

释放:
int sem_destroy (sem_t *sem);

10、linux信号量的问题

sem_init:初始化信号量sem_t,初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享。
sem_wait:一直阻塞等待直到信号量>0。
sem_timedwait:阻塞等待若干时间直到信号量>0。
sem_post:使信号量加1。
sem_destroy:释放信号量。和sem_init对应。 答案补充 关于各函数的具体参数请用man查看,如man sem_init可查看该函数的帮助

与linuxseminit相关的知识