我为NSThread和Grand Central Dispatch(GCD)创建了一些测试代码:
- (void)doIt:(NSNumber *)i
{
sleep(1);
NSLog(@"Thread#%i", [i intValue]);
}
- (IBAction)doWork:(id)sender
{
for (int i = 0; 10 > i; i++) {
NSNumber *t = [NSNumber numberWithInt:i];
[NSThread detachNewThreadSelector:@selector(doIt:) toTarget:self withObject:t];
}
sleep(1);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(10, queue, ^(size_t i) {
sleep(1);
NSLog(@"GCD#%u",(int)i);
});
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
2011-04-13 19:41:07.806 GDC[1494:5e03] Thread#0
2011-04-13 19:41:07.813 GDC[1494:6903] Thread#3
2011-04-13 19:41:07.812 GDC[1494:6403] Thread#2
2011-04-13 19:41:07.812 GDC[1494:5f03] Thread#1
2011-04-13 19:41:07.813 GDC[1494:6e03] Thread#4
2011-04-13 19:41:07.814 GDC[1494:7303] Thread#5
2011-04-13 19:41:07.814 GDC[1494:7803] Thread#6
2011-04-13 …Run Code Online (Sandbox Code Playgroud) 此片段着色器代码在Windows中编译,但在OS X(Mountain Lion,使用3.2核心上下文)中引发错误.
#version 150 core
in int vinstance_id;
uniform uint object_id[16];
out uint id_map;
void main() {
id_map = object_id[vinstance_id];
}
Run Code Online (Sandbox Code Playgroud)
错误是:
ERROR: 0:2: int can't be an in in the fragment shader
Run Code Online (Sandbox Code Playgroud)
我不认为这是正确的:在GLSL 1.50规范中,第4.3.4节说明片段着色器:
片段输入只能是有符号和无符号整数和整数向量,浮点数...
这是驱动程序错误吗?
是否有关于std :: stack元素销毁顺序的保证?
我有一堂课,负责管理一组服务的生命周期。由于可能存在服务相互依赖关系,因此构建和销毁的顺序很重要-应该以与创建服务相反的顺序销毁服务。
我以为我会std::stack<std::unique_ptr<Service>>为此目的使用。我搜索了堆栈,并知道它可能会影响其销毁语义,因此我搜索了一下,但是找不到任何文档(第800页)来保证std :: stack元素的销毁顺序。
最后,我写了一个小测试:
struct Squealer {
Squealer() {
static int instance_count = 0;
this->instance = ++instance_count;
}
~Squealer() {
std::cout << "Destroying instance " << instance << std::endl;
}
int instance;
};
int main(int argc, char *[] argv) {
{
std::stack<Squealer> squealers;
squealers.emplace();
squealers.emplace();
squealers.emplace();
}
std::cout << "...done" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
结果符合预期:
Destroying instance 3
Destroying instance 2
Destroying instance 1
...done
Run Code Online (Sandbox Code Playgroud)
我应该依靠这种行为吗?是为std :: stack保证了天真的销毁顺序,还是我应该采取(显然很容易的)弹出步骤直到明确为止?