Posix多线程编程学习笔记(三)—信号灯(1)

Posix有名信号灯

       函数sem_open创建一个新的有名信号灯或打开一个已存在的有名信号灯。有名信号灯总是既可用于线程间的同步,又可以用于进程间的同步。

 

1.posix有名信号灯函数

1.

名称:

sem_open

功能:

创建并初始化有名信号灯

头文件:

#include <semaphore.h>

函数原形:

sem_t *sem_open(const char *name,int oflag,/*mode_t mode,unsigned int value*/);

参数:

name  信号灯的外部名字

oflag  选择创建或打开一个现有的信号灯

mode 权限位

value 信号灯初始值

返回值:

成功时返回指向信号灯的指针,出错时为SEM_FAILED

      

 

 

 

 

 

 

 

 oflag参数可以是0O_CREAT(创建一个信号灯)或O_CREAT|O_EXCL(如果没有指定的信号灯就创建),如果指定了O_CREAT,那么第三个和第四个参数是需要的;其中mode参数指定权限位,value参数指定信号灯的初始值,通常用来指定共享资源的书面。该初始不能超过SEM_VALUE_MAX,这个常值必须低于为32767。二值信号灯的初始值通常为1,计数信号灯的初始值则往往大于1

       如果指定了O_CREAT(而没有指定O_EXCL),那么只有所需的信号灯尚未存在时才初始化它。所需信号灯已存在条件下指定O_CREAT不是一个错误。该标志的意思仅仅是“如果所需信号灯尚未存在,那就创建并初始化它”。但是所需信号灯等已存在条件下指定O_CREAT|O_EXCL却是一个错误。

       sem_open返回指向sem_t信号灯的指针,该结构里记录着当前共享资源的数目。

 

/*semopen.c*/

#include <semaphore.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

 

int main(int argc,char **argv)

{

sem_t *sem;

 

if(argc!=2)

{

    printf(“please input a file name!/n”);

    exit(1);

}

sem=sem_open(argv[1],O_CREAT,0644,1);

exit(0);

}

#gcc –lpthread –o semopen semopen.c

#./semopen

 

2.

名称:

sem_close

功能:

关闭有名信号灯

头文件:

#include <semaphore.h>

函数原形:

int sem_close(sem_t *sem);

参数:

sem 指向信号灯的指针

返回值:

若成功则返回0,否则返回-1

     

 

 

 

 

  一个进程终止时,内核还对其上仍然打开着的所有有名信号灯自动执行这样的信号灯关闭操作。不论该进程是自愿终止的还是非自愿终止的,这种自动关闭都会发生。

       但应注意的是关闭一个信号灯并没有将它从系统中删除。这就是说,Posix有名信号灯至少是随内核持续的:即使当前没有进程打开着某个信号灯,它的值仍然保持。

 

3.

名称:

sem_unlink

功能:

从系统中删除信号灯

头文件:

#include <semaphore.h>

函数原形:

int sem_unlink(count char *name);

参数:

name  信号灯的外部名字

返回值:

若成功则返回0,否则返回-1

      

 

 

 

 有名信号灯使用sem_unlink从系统中删除。

每个信号灯有一个引用计数器记录当前的打开次数,sem_unlink必须等待这个数为0时才能把name所指的信号灯从文件系统中删除。也就是要等待最后一个sem_close发生。

 

/*semunlink.c*/

#include <semaphore.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

 

int main(int argc,char **argv)

{

sem_t *sem;

int val;

if(argc!=2)

{

    printf(“please input a file name!/n”);

    exit(1);

}

if((sem_unlink(argv[1]))!=0)

    perror(“sem_unlink”);

else

    printf(“success”);

exit(0);

}

 

4.

名称:

sem_getvalue

功能:

测试信号灯

头文件:

#include <semaphore.h>

函数原形:

int sem_getvalue(sem_t *sem,int *valp);

参数:

sem 指向信号灯的指针

返回值:

若成功则返回0,否则返回-1

 

 

 

 

 

 

 

 

 

sem_getvalue在由valp指向的正数中返回所指定信号灯的当前值。如果该信号灯当前已上锁,那么返回值或为0,或为某个负数,其绝对值就是等待该信号灯解锁的线程数。

 

/*semgetvalue.c*/

#include <semaphore.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

 

int main(int argc,char **argv)

{

sem_t *sem;

int val;

 

if(argc!=2)

{

    printf(“please input a file name!/n”);

    exit(1);

}

sem=sem_open(argv[1],0);

sem_getvalue(sem,&val);

printf(“getvalue:value=%d/n”,val);

exit(0);

}

 
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
POSIX多线程编程是一种基于UNIX操作系统的多线程编程模型,也是一种符合POSIX线程标准的编程方式。POSIX多线程编程可以帮助开发者更好地利用系统资源,并提高程序的性能和可扩展性。 POSIX多线程编程涉及的主要内容包括线程的创建、同步和调度等。通过使用线程库提供的函数和数据结构,开发者可以方便地创建和管理多个线程。线程可以共享进程的资源,包括内存、文件描述符等,这样可以避免进程间的数据传输和同步开销,提高程序的效率。 在POSIX多线程编程中,开发者可以使用同步机制来确保线程之间的正确协同工作。例如,互斥锁可以用来保护共享资源的访问,条件变量可以用来进行线程间的通信和等待。同时,开发者还可以使用信号量来进行线程间的同步和互斥操作。这些同步机制可以帮助开发者实现良好的线程互动,避免数据竞争和死锁等问题。 此外,POSIX多线程编程还提供了一些线程调度的接口,开发者可以通过调整线程的优先级和睡眠时间等参数来控制线程的执行顺序和时间片分配。这样可以更好地满足不同线程对系统资源的需求,提高程序的相应能力和性能。 综上所述,POSIX多线程编程是一种强大且灵活的编程模型,它能帮助开发者充分发挥多核处理器的计算能力,优化程序的并发性能。通过合理使用线程的创建、同步和调度等技术,开发者可以编写出更高效、更可靠的多线程应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值