objective-c 多线程并发售票问题 NSLock 临界资源 临界区

并发售票系统实现与临界资源管理
本文介绍了一个使用多线程并发售票系统的实现,通过NSLock进行临界资源管理,确保了售票过程的线程安全。文章详细阐述了售票员线程的工作流程、同步机制及检查票务状态的方法。
From:http://blog.youkuaiyun.com/xiaofei125145/article/details/41445137
//  main.m
//  testProjectCmdLine
//
//  Created by qiao.zhiguang on 14/11/24.
//  Copyright (c) 2014年 cloudacc. All rights reserved.
//


#import <Foundation/Foundation.h>




//  临界资源:多线程并发访问的 全局变量
//  临界区:  线程中访问临界资源的 代码块


int ticketCount = 20;//总票数  (临界资源)
NSLock * ticketLock; //   临界资源(票)锁


void ticketSellor(int sellorIndex);//售票员


int main(int argc,const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        ticketLock = [[NSLock alloc]init];
        
        dispatch_queue_t concurrentQueue =dispatch_queue_create(NULL,DISPATCH_QUEUE_CONCURRENT);
        for (int i =1; i <=5; i++) {// 提交5个并发售票线程
            dispatch_async(concurrentQueue, ^{
                ticketSellor(i);//并发售票
            });
        }
    }
    
    while (YES) {
        sleep(5);//每五秒检查一次看是否已经卖完
        [ticketLock lock];
        //**************************************  <临界区>
        if (ticketCount ==0) {
            NSLog(@"票已经售完,程序关闭");
            
            return0;
        }
        //**************************************  <临界区/>
        [ticketLock unlock];
    }
}
void ticketSellor(int sellorIndex){
    
    while (YES) {
        
        sleep(rand()%6+1);// 等待购票人来购票
        NSLog(@"售票员 %d等待 临界资源 ...",sellorIndex);
        [ticketLock lock];
        //**************************************  <临界区>
        if (ticketCount>0) {
            NSLog(@"售票员 %d正在 出售第  %d 张票 ...",sellorIndex,ticketCount);
            
            ticketCount --;
        }else{
            NSLog(@"售票员 %d发现票已经售完,等待...",sellorIndex);
        }
        //**************************************  <临界区/>
        [ticketLock unlock];
        
        
        
    }

}dHlwZT1mdyZzaXplPTY0MCZzcmM9YUhSMGNDVXpRU1V5UmlVeVJtbHRaeTVpYkc5bkxtTnpaRzR1Ym1WMEpUSkdNakF4TkRFeE1qUXhOVE14TVRBMU1EVWxNMFozWVhSbGNtMWhjbXNsTWtZeUpUSkdkR1Y0ZENVeVJtRklVakJqUkc5MlRESktjMkl5WTNWWk0wNXJZbWsxZFZwWVVYWmxSMnhvWWpKYWJHRlVSWGxPVkVVd1RsRWxNMFFsTTBRbE1rWm1iMjUwSlRKR05XRTJURFZNTWxRbE1rWm1iMjUwYzJsNlpTVXlSalF3TUNVeVJtWnBiR3dsTWtaSk1FcENVV3RHUTAxQkpUTkVKVE5FSlRKR1pHbHpjMjlzZG1VbE1rWTNNQ1V5Um1keVlYWnBkSGtsTWtaRFpXNTBaWEk9.png


### 修改 `mandatory.yaml` 文件中的 `nginx-configuration ConfigMap` 为了调整 Nginx Ingress Controller 的行为,可以通过编辑 `ConfigMap` 来完成特定设置。对于希望修改的日志格式上游 (`log-format-upstream`) 字段,在 `mandatory.yaml` 部署文件中找到对应的 `nginx-configuration` ConfigMap 并做相应更改[^1]。 ```yaml apiVersion: v1 kind: ConfigMap metadata: name: nginx-configuration namespace: ingress-nginx data: log-format-upstream: '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$upstream_service_time"' ``` 上述 YAML 片段展示了如何自定义日志条目格式,以便更好地满足监控需求或遵从公司内部标准。 ### 关于 Ingress-Nginx Ingress-Nginx 是一种用于 Kubernetes 的入口控制器解决方案,能够处理来自互联网的 HTTP/HTTPS 请求并将其转发给集群内的适当服务实例。通过声明式的 API 对象——即 Ingress 资源来描述这些路由规则,从而简化了复杂网络拓扑下的流量管理过程[^2]。 当新版本发布时(例如 1.9.0),通常会引入性能改进、安全修复以及新的特性支持,因此保持组件处于最新状态非常重要[^3]。 ### 故障排查指南 如果遇到与 Ingress-Nginx 控制器有关的问题,则可以从检查其日志记录开始入手。Kubernetes 提供了一套强大的工具集帮助管理员诊断问题所在: - **查看 Pod 日志**:利用命令行工具 kubectl 获取正在运行的应用程序的标准输出流; ```bash kubectl logs <pod-name> -n ingress-nginx ``` - **查询事件列表**:有时错误不会直接反映在应用程序本身的日志里,而是作为 K8s 系统级别的警告存在; ```bash kubectl get events --sort-by='.lastTimestamp' -n ingress-nginx ``` 以上方法有助于快速定位潜在原因,并采取针对性措施加以解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值