iOS线程锁简单样例

#import "ViewController.h"

@interface ViewController ()
{
    NSInteger _cnt;
    NSLock *_lock;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //必须先创建锁
    _lock = [[NSLock alloc] init];
    

    [NSThread detachNewThreadSelector:@selector(thread1Click) toTarget:self withObject:nil];
    [NSThread detachNewThreadSelector:@selector(thread2Click) toTarget:self withObject:nil];
}
/*
 下面两个线程 执行的函数 共同操作同一个资源变量
 如果我们不做任何处理 那么两个线程就会争抢资源,这样就达不到我们想要的效果,数据有可能导致比较混乱
 
 //如果两个线程要操作同一个资源,那么我们一般要进行加锁保护,当访问资源的时候进行加锁,访问结束 解锁
 
 */
#pragma mark - 子线中调用的函数
//线程1想做 两次执行 之间 间隔10
- (void)thread1Click{
    NSLog(@"线程1开始");
    //加锁
    /*
     一旦线程 执行 [_lock lock],先检测一下 有没有加锁,如果加锁那么当前线程就会阻塞 直到 这个锁解锁之后 才能继续执行,如果 锁 没有锁着,立即加上锁锁住继续执行下面的代码
     同一个资源多个线程必须是同一把锁
     
     
     //加锁的话要注意防止死锁
     */
    [_lock lock];
    for (NSInteger i = 0; i < 10; i++) {
        _cnt += 10;
        NSLog(@"%s_cnt:%ld",__func__,_cnt);
        [NSThread sleepForTimeInterval:0.5];
    }
    
    
    [_lock unlock];
    NSLog(@"线程1即将结束");
}
//线程2想要的现象是 每次间隔2
- (void)thread2Click{
    NSLog(@"线程2开始");
    
    [_lock lock];
    for (NSInteger i = 0; i < 10; i++) {
        _cnt -= 2;
        NSLog(@"%s_cnt:%ld",__func__,_cnt);
        [NSThread sleepForTimeInterval:0.5];
    }
    [_lock unlock];
    
    NSLog(@"线程2即将结束");
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
时间: 2024-11-01 02:50:17

iOS线程锁简单样例的相关文章

Junit的最简单样例:Hello world!

我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3824934.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验. 不多说了,贴两段代码. HelloWorld类: public class HelloWorld { public void main() { System.out.println(helloWorld()); } public static String helloWorld() { retu

自己定义隐式转换和显式转换c#简单样例

自己定义隐式转换和显式转换c#简单样例 (出自朱朱家园http://blog.csdn.net/zhgl7688) 样例:对用户user中,usernamefirst name和last name进行转换成合成一个限定长度为10个字符新name. 自己定义隐式转换: namespace transduction { public partial class transductionForm : Form { public transductionForm() { InitializeCompon

JsPlumb简单样例

JsPlumb简单样例: <!DOCTYPE html> <html> <head>     <script src="jquery-1.9.0.js"></script>     <script src="jquery-ui-1.9.2-min.js"></script>     <script src="jquery.jsPlumb-1.4.0-all.js&qu

velocity简单样例

velocity简单样例整体实现须要三个步骤,详细例如以下: 1.创建一个Javaproject 2.导入须要的jar包 3.创建须要的文件 ============================================ 1.创建一个Javaproject 名称:JKTest,例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG92ZV9qaw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA

VC6 鼠标钩子 最简单样例

Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的.而钩子是Windows系统中非常重要的系统接口,用它能够截获并处理送给其它应用程序的消息,来完毕普通应用程序难以实现的功能.钩子能够监视系统或进程中的各种事件消息,截获发往目标窗体的消息并进行处理.这样,我们就能够在系统中安装自己定义的钩子,监视系统中特定事件的发生,完毕特定的功能,比方截获键盘.鼠标的输入,屏幕取词,日志监视等等.可见,利用钩子能够实现很多特殊而实用的功能.因此,对于高级编程人员来说,掌

最大熵算法及简单样例

近期在学模式识别,正在看Introduction to Pattern Recognition这本书,挺不错的一本书.好.以下和大家一起来学习最大熵算法. 首先,最大熵算法是干什么的呢?通常是用来预计一个分布,至于把分布预计出来之后用来干什么,那要视详细问题而定. 那这里的"熵"是什么意思呢?它是指信息熵,一个分布的均匀程度能够用熵的大小来衡量.熵越大,就越均匀.而最大熵就是要求在满足特定约束下,分布是什么样的时候.熵最大.也就是越均匀越好. 为什么在满足特定约束下越均匀越好?由于你已

基于Spring-SpringMVC-Mybatis的简单样例

复习下 好久没搞过撸过代码了! 这个样例包括一个完整的增删改查! 源代码地址http://download.csdn.net/detail/wangdianyong/8909903

使用SALT-API进入集成开发的简单样例

测试的时候,可以CURL -K,但真正作集成的时候,却是不可以的. 必须,不可以让TOKEN满天飞吧. 现在进入这个阶段了.写个样例先: import salt import salt.auth import salt.log import saltapi opts = salt.client.LocalClient().opts auth = salt.auth.LoadAuth(opts) lowstate = {'username':'XXX','password':'XXX','eaut

Spring Ajax一个简单样例

配置不说了.要在前面helloworld的样例基础上弄. 相同在hello下新建ajax.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page isELIgnored ="false" %> <!DOCTYPE html PUBLIC "-//