小编Jus*_*tin的帖子

Grand Central Dispatch vs. NSThread

我为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)

cocoa-touch nsthread grand-central-dispatch ios

19
推荐指数
2
解决办法
2万
查看次数

GLSL 1.50:"在int中"在OS X中不合法?

此片段着色器代码在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节说明片段着色器:

片段输入只能是有符号和无符号整数和整数向量,浮点数...

这是驱动程序错误吗?

opengl macos glsl opengl-3 osx-mountain-lion

3
推荐指数
1
解决办法
779
查看次数

std :: stack元素销毁顺序

是否有关于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保证了天真的销毁顺序,还是我应该采取(显然很容易的)弹出步骤直到明确为止?

c++ c++11

3
推荐指数
1
解决办法
315
查看次数