当前位置: 首页 > news >正文

抚州南城网站建设网络销售有限公司

抚州南城网站建设,网络销售有限公司,免费word模板网站,网站建设都 包括哪些简介 无名信号量#xff08;在 POSIX 环境下通常指 sem_t 类型的信号量#xff09;是用于同步和互斥的原语#xff0c;它允许线程和进程按照预期的顺序执行#xff0c;并确保对共享资源的安全访问。无名信号量与命名信号量的主要区别在于它们的可见性和生命周期。无名信号…简介 无名信号量在 POSIX 环境下通常指 sem_t 类型的信号量是用于同步和互斥的原语它允许线程和进程按照预期的顺序执行并确保对共享资源的安全访问。无名信号量与命名信号量的主要区别在于它们的可见性和生命周期。无名信号量通常用于一个进程内的线程间同步而命名信号量用于多个进程间的同步。 以下是无名信号量的详细介绍 1. 基础概念 信号量的值信号量是一个非负整数通常代表可用的资源数量。例如信号量值为2意味着有2个资源可用。 操作主要有两种基本操作 - wait或 down、P和 post或 up、V。 2. 核心操作 sem_init用于初始化信号量。需要提供信号量变量的地址、一个标志指示信号量是否应在多个进程之间共享以及信号量的初始值。 int sem_init(sem_t *sem, int pshared, unsigned int value);其中pshared 通常设为0表示此信号量只用于当前进程的线程之间的同步。 sem_wait如果信号量的值大于零它将减少信号量的值并继续。如果信号量的值为0调用此操作的线程将被阻塞直到信号量的值变为正数。 int sem_wait(sem_t *sem);sem_post增加信号量的值。如果其他线程正在等待此信号量一个或多个等待线程可能被唤醒。 int sem_post(sem_t *sem);sem_destroy销毁信号量释放与其关联的任何资源。 int sem_destroy(sem_t *sem);3. 使用场景 互斥访问当多个线程需要访问共享资源但我们希望一次只有一个线程可以访问时可以使用信号量。例如访问一个共享文件或更新一个共享数据结构。 条件同步例如一个线程生产数据另一个线程消费数据。消费者线程可能需要等待直到生产者线程生产了足够的数据。 4. 注意事项 虽然无名信号量通常用于线程间同步但在某些平台和实现中它们也可以用于进程间同步只要这些进程共享同一个信号量变量。 使用 sem_destroy 之前确保没有线程等待该信号量。否则行为可能是未定义的。 与所有同步原语一样使用信号量需要谨慎以避免死锁和竞态条件。 总的来说无名信号量是一种非常有用的同步工具它提供了一种简单、有效的方法来协调线程的行为和确保对共享资源的安全访问。 示例 以下是一个使用 POSIX 无名信号量进行线程间同步的例子。在这个例子中我们有两个线程生产者和消费者。生产者线程生成数据消费者线程消费它。我们使用信号量来确保生产者产生数据后消费者才开始消费。 #include stdio.h #include stdlib.h #include pthread.h #include semaphore.hsem_t sem_producer, sem_consumer;#define DATA_SIZE 5 int buffer[DATA_SIZE]; int index 0;void* producer(void* arg) {for (int i 0; i DATA_SIZE; i) {sem_wait(sem_producer); // Wait until there is a spot available.buffer[index] i; // Produce data.printf(Produced %d\n, i);sem_post(sem_consumer); // Signal that data has been produced.}return NULL; }void* consumer(void* arg) {for (int i 0; i DATA_SIZE; i) {sem_wait(sem_consumer); // Wait until data is available.int data buffer[--index]; // Consume data.printf(Consumed %d\n, data);sem_post(sem_producer); // Signal that a spot is free.}return NULL; }int main() {pthread_t tid1, tid2;// Initialize semaphoressem_init(sem_producer, 0, DATA_SIZE); // Initially, DATA_SIZE spots are available.sem_init(sem_consumer, 0, 0); // Initially, no data is available to consume.pthread_create(tid1, NULL, producer, NULL);pthread_create(tid2, NULL, consumer, NULL);pthread_join(tid1, NULL);pthread_join(tid2, NULL);sem_destroy(sem_producer);sem_destroy(sem_consumer);return 0; }在上面的例子中 sem_producer 信号量表示可用的缓冲区槽位数量。开始时所有槽位都是可用的。sem_consumer 信号量表示可供消费的数据数量。开始时没有数据可供消费。 生产者每次生产一个数据项前都会等待一个可用的槽位消费者在每次消费前都会等待可供消费的数据。 运行结果如下 Produced 0 Consumed 0 Produced 1 Consumed 1 Produced 2 Consumed 2 Produced 3 Consumed 3 Produced 4 Consumed 4从另一个视角看这个程序 以下是生产者和消费者线程共享的资源 变量 buffer[]这是一个整数数组用于存储生产者产生的数据和消费者消费的数据。index这是一个整数表示buffer[]中的下一个可用位置或要被消费的数据位置。sem_producer和sem_consumer这是我们用于同步的无名信号量。一个表示有多少空的槽位可用来存储数据另一个表示有多少数据可供消费。 无名信号量我们使用sem_init初始化了两个无名信号量。由于这两个信号量是在主进程的地址空间内初始化的它们可以被该进程内的所有线程在这里是生产者和消费者线程访问和操作。 关于线程和进程 进程在这个程序中主函数main()运行在主进程中。所有的全局变量、函数、和在main()函数内定义的局部变量都在这个进程的地址空间内。 线程我们使用pthread_create()创建了两个线程。这两个线程生产者和消费者都在上述的主进程内运行。因此它们共享上述的主进程的地址空间这也就是为什么它们可以访问和操作同样的变量和无名信号量。 总结这个程序中只有一个进程。在这个进程内我们创建了两个线程它们共享同一块地址空间。这也是为什么无名信号量特别适合于线程间的同步因为所有线程都可以直接访问和操作进程内的同一个无名信号量。
http://www.w-s-a.com/news/229754/

相关文章:

  • 太原网站建设设计网站建设策划书(建设前的市场分析)
  • 哪里有制作网站电商新手入门知识
  • 制作网站的后台文昌网站建设 myvodo
  • 网站 购买移动网站制作
  • 南京网站网站建设学校英山做网站多少钱
  • 珠海网站建设网如何注册公司公众号
  • 手机网站页面制作网站怎么做快照
  • asp网站怎么仿站推广软件下载平台
  • 电子商务网站建设期末试题08答案互联网怎么做
  • 规范门户网站的建设和管理办法微信网站开发公司电话
  • 免费行情网站凡客的官网
  • 做网站运营的女生多吗海淀企业网站建设
  • 网站运行环境配置网站建设个一般需要花费多少钱
  • 广西平台网站建设报价wordpress 免费 企业 主题
  • 四川省建设厅职称查询网站辽宁省住房和城乡建设部网站
  • 公司网站后台登陆网站放到云服务器上怎么做
  • 济南 网站定制做网站购买域名
  • 代理分佣后台网站开发怎么用源码做网站视频
  • 天津网站建设招标wordpress七牛图片插件
  • 建设合同施工合同示范文本汕头市网络优化推广平台
  • 网站关键词修改老王搜索引擎入口
  • 那个网站做搬家推广比较好建设部网站办事大厅栏目
  • 做企业销售分析的网站广州网站设计建设
  • 建站流程wordpress怎么开伪静态
  • 服务器不是自己的做违法网站videopro wordpress
  • 北京建网站的公司哪个比较好网站开通告知书
  • 网站负责人 主体负责人黑龙江 建设监理协会网站
  • 手机网站焦点图代码建设工程质量检测网站
  • 墙绘做网站推广有作用没html网页制作用什么软件
  • 企业做网站有用吗网站推广的常用方法有哪些?