- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我定义了一个 NSInteger 计数器
并在回调中更新了它的值,如下面的代码所示(回调在另一个线程中):
-(void) myFunc {
NSLog(@"initialise counter...");
// I try to use volatile to make it thread safe
__block volatile NSInteger counter = 0;
[self addObserver:myObserver withCallback:^{
// this is in another thread
counter += 1;
NSLog(@"counter = %d", counter);
}];
}
我使用 volatile
关键字使 counter
线程安全,它在属于另一个线程的回调 block 中访问。
当我调用 myFunc
两次时:
// 1st time call
[self myFunc];
// 2nd time call
[self myFunc];
输出是这样的:
initialise counter...
counter = 1;
counter = 2;
counter = 3;
counter = 4;
counter = 1; // weird
initialise counter...
counter = 2; // weird
counter = 3;
counter = 1; // weird
counter = 4;
看起来第二次调用产生了一个初始值错误的计数器,counter=4
之前的输出是 counter=1
,这也很奇怪。
是不是因为我的代码即使使用 volatile
关键字也不是线程安全的?如果是这样,如何使我的计数器线程安全?如果它是线程安全的,为什么我会得到奇怪的输出?
最佳答案
对于原子计数器的简单情况,GCD 就有点过分了。使用 OSAtomic 函数:
-(void) myFunc {
static int64_t counter;
[self addObserver:myObserver withCallback:^{
// this is in another thread
int64_t my_value = OSAtomicIncrement64Barrier(&counter);
NSLog(@"counter = %d", my_value);
}];
}
请注意,代码记录的是增量函数的结果,而不是静态变量。结果为您提供特定操作的原子结果。使用静态变量将为您提供计数器的快照,该快照对于您的增量操作而言不是原子的。
关于ios - 使一个简单的 NSInteger 计数器线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37990290/
在简单类的实现中,我在这一行收到错误“无效接收者类型'NSInteger'”: self.price = p; // this line throws error 我应该将价格指定为c
我正在尝试做一件非常简单的事情,但我不知道怎么做; NSInteger * a=10; a=a-1; NSlog(@"a=%d",a); 由于某种原因,它显示 a=6。 怎么可能? 最佳答案 您的问题
我意识到 for 循环可能是执行此操作的最佳方法,我只是不知道每通过 5 个障碍,将 totalScriptures 整数加 1 的正确方法 我有一个类似于 flappybird 的应用程序。一个对象
我想弄清楚如何在 iOS 上获取两位数的 NSInteger(例如 11)并将其转换为 2 个独立的 NSInteger,每个看起来都像“1”。在 NSInteger 中它总是只有 2 位数字,不多不
我正在尝试编写代码来检测一个整数是否大于另一个整数。这可能吗? 这是我到目前为止所做的事情。 if (NumCorrect >> NumWrong) { btnCool.title = @"A
我正在尝试在我准备加载的 View 上设置一个变量。下面是设置它的代码: NSInteger amountOfQuestions = [self.questions.text intValue];
这看起来是一个非常愚蠢的问题,但我不明白为什么会出现错误。 我有一个实例变量声明为: NSInteger *scopeSelected; 我使用这个变量来跟踪在 UISearchDisplay Con
我的 C++ 知识一塌糊涂。我有 Apple 提供的代码,他们像往常一样提供了不完整的解决方案。 在此代码中,他们提供了两个空的方法 header : - (NSString *)encodeBase
一般我看到的声明常量的代码是这样的: static const NSInteger kNum = 1; static NSString * const kStr = @"A"; 我知道为什么const
我正在尝试使用代码从 NSDictionary 中解析一个整数 [activeItem setData_id:[[NSString stringWithFormat:@"%@", [dict valu
NSInteger 是否占用内存?我们应该在 FOR 循环中使用它吗? 最佳答案 看看Apple文档,NSInteger是这样的: #if __LP64__ || TARGET_OS_EMBEDDED
我正在尝试做一些我认为相对简单的事情并获取本周的当前日期,然后在点击按钮时针对该天进行一些检查。为了获取星期几,我在 viewDidLoad 方法中使用了以下代码: NSDate *today = [
我需要将 NSInteger 的最大值存储到 NSInteger 中?执行此操作的正确语法是什么? 谢谢。 最佳答案 NSInteger 的最大值是 NSIntegerMax . 关于cocoa -
这个问题在这里已经有了答案: When to use NSInteger vs. int (8 个答案) 关闭 8 年前。 在 iPhone 编程中使用 NSInteger 与 int 的原因是什么
我正在我的应用程序中创建一个计数器。我想在发生特定更改时增加它。计数器将其值从 0 增加到 1。然后它会固定为 1,并且不再增加。这是我的代码。在 .h 中我已经做到了这一点。 @interface
当我尝试将 nsinteger 值添加到数组中时,它显示警告, Incompatible pointer to integer conversion sending 'NSInteger *' (ak
我确定我遗漏了一些明显的东西,但我想在 Objective C 中创建一个 NSInteger 指针的实例。 -(NSInteger*) getIntegerPointer{ NSInteger
我正在尝试使用以下代码生成随机负 NSInteger, + (NSInteger)getNegativeRandomNumber { uint32_t random = arc4random_
我想知道16位整数、32位整数和64位整数有什么区别,有符号整数和无符号整数的区别(N整数和整数) 最佳答案 我不确定您所说的“16 位整数”、“32 位整数”和“64 位整数”到底是什么类型,但通常
如何检查 NSInteger 是否有效? NSInteger previousScore = [[self score] integerValue]; if (previousScore !=
我是一名优秀的程序员,十分优秀!