首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pthreads和并发性

pthreads和并发性
EN

Stack Overflow用户
提问于 2013-02-18 01:46:21
回答 3查看 1K关注 0票数 3

我有以下代码:

代码语言:javascript
复制
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

#define LOOPS 10000

void *run(void *arg)
{
    int id = strtol(arg,NULL,0);
    int i;
    for(i=0; i<LOOPS; i++)
    {
        printf("In %d.\n",id);
    }
}

int main()
{
    pthread_t p1,p2;
    void *res;

    pthread_create(&p1,NULL,run,"1");
    pthread_create(&p2,NULL,run,"2");
    pthread_join(p1,&res);
    pthread_join(p2,&res);
    return 0;
}

当我运行此命令时,字符串"In 1“连续显示10000次,"In 2”连续显示10000次,反之亦然。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-18 01:51:36

调度器交织线程的顺序是不确定的(...well,但仅从调度器/内核的角度来看)。你不应该对订单做假设。

在这种情况下,您会遇到这样的情况:任一线程被允许在调度器->preempts它之前完成它们的全部工作,并允许另一个线程运行。

票数 8
EN

Stack Overflow用户

发布于 2013-02-18 02:04:54

调度器在时隙中运行进程。时隙足够大,可以高效,但也足够小,可以给人一种同时执行的错觉。

在多核CPUS上,在操作系统内核级实现的线程实际上将并行执行。

最重要的是,输出有时会被缓冲,因为进行一次大写操作所需的处理能力与进行一次小写操作所需的处理能力大致相同。在大多数系统上,当输出到交互式终端设备时,缓冲是禁用的,但现在环境的细节开始变得真正重要。

对于交错的输出,它必须是无缓冲的,并且在一个调度程序上运行,该调度程序或者是多核的,或者是异常细粒度的,并且仅仅因为您生成了一行输出就愿意进行昂贵的上下文切换。如果是多核的,那么通过库和内核的执行路径必须恰好平衡在三个核心上。这可能永远不会发生。

毕竟,您是一次创建一个,并且一个总是准备好在另一个之前运行。

票数 2
EN

Stack Overflow用户

发布于 2013-02-18 02:08:25

另外两个答案是正确的,但我想补充一下:

两个输出是交错的。它们只是不是每一行或两行都是交错的,而更有可能是数千行。当给每个线程一个时间量时,它有输出数千行代码的时间。因为您只在每个线程上打印10k行,所以一个线程有时间在另一个线程开始之前完成它的工作。

尝试用无限循环替换您的for循环,并观察会发生什么。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14924061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档