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

代理商门户网站开发中国最大免费h5游戏源码网站

代理商门户网站开发,中国最大免费h5游戏源码网站,建设银行网站地址,上海闵行区邮编信号量 信号量(Semaphore)是并发编程中的一个核心同步原语,它在多进程和多线程环境下被设计用来协调不同的执行单元,确保它们在对共享资源的访问上达到同步和互斥。信号量内部维护一个计数器,该计数器的初始值可以被视…

信号量

信号量(Semaphore)是并发编程中的一个核心同步原语,它在多进程和多线程环境下被设计用来协调不同的执行单元,确保它们在对共享资源的访问上达到同步和互斥。信号量内部维护一个计数器,该计数器的初始值可以被视为可用资源的数量。当一个进程或线程试图“获取”一个信号量时,该计数器会递减;当它“释放”信号量时,计数器则递增。如果计数器的值达到零,任何试图获取信号量的操作都会被阻塞,直至其他进程或线程释放资源。

信号量通常可以分为两大类:命名信号量(Named Semaphores)和无名信号量(Unnamed Semaphores)。命名信号量是通过一个独特的标识符,在系统级别进行识别的,通常与文件系统上的某个文件关联。这使得不同的进程可以通过这一标识符来定位和操作同一个信号量。而无名信号量主要存在于进程的内存地址空间中,通常用于进程内的线程同步。由于无名信号量仅存在于进程的内存中,因此它们的生命周期与包含它们的进程相同。

为了有效利用信号量,开发者需要深入理解其工作机制和相关的API调用,确保在并发和竞争条件下实现正确、高效的资源访问控制。

实现信号量

实现信号量仅使用原子变量是相对复杂的。以下是一个简单的信号量实现,使用 C11 的 atomic_int

#include <stdio.h>
#include <stdatomic.h>
#include <stdbool.h>
#include <pthread.h>typedef struct {atomic_int value;
} AtomicSemaphore;void AtomicSemaphore_init(AtomicSemaphore* sem, int initial) {atomic_store(&sem->value, initial);
}void AtomicSemaphore_wait(AtomicSemaphore* sem) {int expected;do {while ((expected = atomic_load(&sem->value)) <= 0) {// busy-wait/spin until value is greater than 0}} while (!atomic_compare_exchange_weak(&sem->value, &expected, expected - 1));
}void AtomicSemaphore_post(AtomicSemaphore* sem) {atomic_fetch_add(&sem->value, 1);
}void* test_func(void* arg) {AtomicSemaphore* sem = (AtomicSemaphore*)arg;AtomicSemaphore_wait(sem);printf("Thread %ld acquired the semaphore!\n", pthread_self());AtomicSemaphore_post(sem);return NULL;
}int main() {AtomicSemaphore sem;AtomicSemaphore_init(&sem, 1);  // Initial value set to 1pthread_t threads[10];for (int i = 0; i < 10; i++) {pthread_create(&threads[i], NULL, test_func, &sem);}for (int i = 0; i < 10; i++) {pthread_join(threads[i], NULL);}return 0;
}

注意:

  1. 这个简单的信号量实现使用了"忙等待"或自旋,这可能会导致性能问题,尤其是在高度竞争的情况下。

  2. atomic_compare_exchange_weak 函数尝试将 sem->value 更新为 expected - 1,只有当 sem->value 的当前值与 expected 匹配时才会这样做。如果不匹配,函数将返回 false,并在 expected 中设置当前的 sem->value

  3. 在真实环境中,可能需要考虑使用更复杂的策略(例如,当信号量值为0时,线程进入休眠状态而不是持续自旋)。

  4. 虽然这个实现提供了原子操作的信号量,但它不是传统的信号量,因为它并不提供线程阻塞功能。这意味着当信号量的值为0时,线程将持续自旋,直到它可以获取信号量。

http://www.yayakq.cn/news/129732/

相关文章:

  • 珍爱网建设网站的目的杭州做网站怎么收费
  • 江永网站建设合肥网站优化费用
  • 龙华建设局网站龙华网站制作要多少钱
  • 南宁专业网站开发贵阳手机银行app下载
  • 洛阳网站建设学校基于 seajs 的高性能网站开发和优化实践_王保平(淘宝)
  • 做公众号封面网站wordpress站做app
  • 世界做诡异的地方网站网站的运营方式
  • 李连杰做的功夫网站网站开发属于软件设计嘛
  • 网站开发编程环境竹子建站官网
  • 文安做网站昆明网站建设价目表
  • 怎么做网站弹幕效果包装设计用什么软件
  • 江苏 网站备案国际贸易进口代理公司
  • 网站建设补充协议苏州手机网站建设服务
  • 成都建设银行网站东软集团
  • P2P网站怎么建设南昌网页制作公司
  • 企业网站推广最有效的方法餐饮品牌形象设计案例
  • 怎么自己做视频网站用jsp做网站的体会
  • 域名备案怎么关闭网站做网络推广一个月的收入
  • 在越南做网站都是什么人网站建设四个步骤
  • php 外贸商城网站建设好乐买网站推广方式
  • 久其软件公司网站网站续费通知
  • 廊坊网站建设模板软件开发前景分析
  • 猎头做单都有什么网站惠州做棋牌网站建设找哪家效益快
  • 设计广告图用什么软件seo经验是什么
  • c 是用来做网站的吗修改 wordpress 时间
  • 网站建设设计设计公司企业邮箱免费注册申请
  • 建设官方网站多少高端的佛山网站建设价格
  • 贵阳网站推广优化公司需要前置审批的网站
  • 广东建设局网站首页荣成信用建设网站
  • 怎样做网站收广告费10G网站空间