什么网站可以接设计方案,百度广告联盟怎么加入,谷歌seo的算法,网站编辑专题怎么做同步 是指多个任务按照约定的先后次序 相互配合完成一件事情 信号量#xff1a;
由信号量决定 线程是继续执行 还是阻塞等待
信号量代表某种资源 其值表示系统中该资源的数量
信号量是一个受保护的量 只能通过特定的三种操作来访问
初始化
P操作#xff08;申请资源
由信号量决定 线程是继续执行 还是阻塞等待
信号量代表某种资源 其值表示系统中该资源的数量
信号量是一个受保护的量 只能通过特定的三种操作来访问
初始化
P操作申请资源 有可能阻塞
V操作释放资源 不会阻塞 Ps)操作
if(信号量的值大于0 )
申请资源的任务继续执行 信号量-1
else
申请资源的任务阻塞· V(s)操作
信号量1
if有任务在等待资源
唤醒等待任务 让其继续执行 Posix信号量
内部定义了两类信号量
无名信号量 基于内存的信号量 主要用于线程间的同步 也可以用于进程之间
但是不方便
有名信号量既可以用于进程 也可以用于线程 信号量操作函数
#includesemaphore.h
int sem_init(sem_t *sem, int pshared,unsigned int vaule) // 信号量初始化
成功返回0 失败返回EOF
sem 指向要初始化的信号量对象
pshared 0 - 线程间 1 - 进程间
val 信号量初值 同文件同上
int sem_wait(sem_t *sem); //P操作
int sem_post(sem_t *sem); //V操作
成功返回0 失败返回EOF
sem 指向要操作的信号量对象
Ps: 两个线程同步读写缓冲区
char buf[32];
sem_t sem;
void *function(void *arg);
int main(void)
{
pthread_t a_thread;
if(sem_init(sem,0, 0) 0)
{
perror(sem_init);
exit(-1);
} if(pthread_create(a_thread, NULL, function, NULL) ! 0)
{
printf(fila to pthread_create);
exit(-1);
} printf(input quit to exit\n); do{
fgets(buf, 32, stdin);
sem_post(sem);
}while(strncmp(buf, quit, 4) ! 0); return 0;
} void *function(void *arg)
{
while(1)
{
sen_wait(sem);
printf(you enter %d characters\n, strlen(buf));
}
} Ps: l两个线程同步读写 char buf[32];
sem_t sem_r, sem_w;
void *function(void *arg);
int main(void)
{
pthread_t a_thread;
if(sem_init(sem_r,0, 0) 0)
{
perror(sem_init);
exit(-1);
}
if(sem_init(sem_w,0, 0) 0)
{
perror(sem_init);
exit(-1);
} if(pthread_create(a_thread, NULL, function, NULL) ! 0)
{
printf(fila to pthread_create);
exit(-1);
} printf(input quit to exit\n); do{
sem_post(sem_w);
fgets(buf, 32, stdin);
sem_wait(sem_r);
}while(strncmp(buf, quit, 4) ! 0); return 0;
} void *function(void *arg)
{
while(1)
{
sen_wait(sem_r);
printf(you enter %d characters\n, strlen(buf));
sen_post(sem_w);
}
} 命令 gcc -o test test.c -lpthread