linux进程的问题

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>

pthread_mutex_t lock;

void fun1(void){

    int i = 0;

     while(i<100){

        printf("A\n");i++;

    }

}

void fun2(void){

    int i = 0;

     while(i<100){

        printf("B\n");i++;

    }

}

int main(){

        pthread_create(&tida, NULL, (void*)fun1, NULL);
        pthread_create(&tidb, NULL, (void*)fun2, NULL);

       pthread_join(tida, NULL);
       pthread_join(tidb, NULL);

    return 0;

}

这个代码,创建了两个线程,分别输出100个A和100个B,但是输出结果很奇怪。

都是BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA。

也就是说先完成了B线程,再完成A线程。

说好的线程抢占CPU呢?

想了很久都没发现答案。。

最后发现是,输出100个A需要的时间太短了。A线程抢到了CPU。在一个时间片里面输出100次A后,时间还足够。所以造成了这个假象。

然后我把循环扩大到100000次,让整个循环不能在一个时间片里面完成,就可以出现交替了。

另一个方法是,用usleep函数,让单次运行得就一点。

不过这还是看个人的电脑

我同学在mac pro上是ABABABA这样输出的。

但我的ubuntu虚拟机确实AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB。

所以以后大家注意这一点。就算用了互斥量或者信号量,都得sleep

很奇怪的问题

时间: 2024-11-07 21:17:57

linux进程的问题的相关文章

Linux进程的睡眠和唤醒

1   Linux进程的睡眠和唤醒 在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状态标志位为TASK_RUNNING.一旦一个运行中的进程时间片用完, Linux内核的调度器会剥夺这个进程对CPU的控制权,并且从运行队列中选择一个合适的进程投入运行. 当然,一个进程也可以主动释放CPU的控制权.函数schedule()是一个调度函数,它可以被一个进程主动调用,从而调度其它进程占用CPU.一旦这个主动放弃CPU的进程被重新调度占用CPU,那么它将从

Linux进程管理与调度-之-目录导航【转】

转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http://blog.csdn.net/gatieme 目录(?)[-] 项目链接 进程的描述 进程的创建 进程的加载与运行 进程的退出 进程的调度 调度普通进程-完全公平调度器CFS 日期 内核版本 架构 作者 GitHub CSDN 2016-07-21 Linux-4.6 X86 & arm gatieme

Linux进程管理简谈

Linux系统进程管理简谈 进程是什么? 简单来说进程是一个正在执行的程序的一个副本,存在生命周期,有段指令和代码在不断运行. linux内核存储信息的固定格式:task struct 进程的相关信息存储在链表中 多个任务的task struct组件的链表:task list 进程的创建:父进程创建子进程(内核创建init进程,剩余一切进程有init及其子进程进程创建) 父进程创建子进程时向内核调用fork()来创建子进程并且通过调用clone()复制父进程的信息给子进程 Linux进程的优先级

Linux进程的实际用户ID和有效用户ID

在Unix进程中涉及多个用户ID和用户组ID,包括如下: 1.实际用户ID和实际用户组ID:标识我是谁.也就是登录用户的uid和gid,比如我的Linux以simon登录,在Linux运行的所有的命令的实际用户ID都是simon的uid,实际用户组ID都是simon的gid(可以用id命令查看). 2.有效用户ID和有效用户组ID:进程用来决定我们对资源的访问权限.一般情况下,有效用户ID等于实际用户ID,有效用户组ID等于实际用户组ID.当设置-用户-ID(SUID)位设置,则有效用户ID等于

Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)【转】

转自:http://blog.csdn.net/gatieme/article/details/51872659 版权声明:本文为博主原创文章 && 转载请著名出处 @ http://blog.csdn.net/gatieme 目录(?)[-] 前景回顾 1 Linux的调度器组成 2 调度工作 进程上下文 1 进程上下文的概念 2 上下文切换 context_switch进程上下文切换 1 context_switch完全注释 2 prepare_arch_switch切换前的准备工作

Linux进程环境

1.进程是什么 正在运行的程序,就是进程,进程是动态的,程序是静态的:进程在执行过程中具有状态的变化. 进程具有三个不同的状态 : 运行.就绪.阻塞; 三模型分析 : 查看进程的命令ps -ef 和 top,   kill PID(杀死进程) 运行态:进程获得CPU资源,能够使用CPU计算机程序中的指令,当CPU的使用时间用完时,则进入就绪状态. 就绪态:其它资源已经就绪,只差CPU资源. 阻塞态:处理CPU之外的其它资源还未就绪. 进程的调度:进程启动时处于就绪状态,为了调度进程对CPU的使用

Linux进程及作业管理

一.进程查看及其管理工具 --------------------------------------------- ps命令:报告当前进程的快照信息 ps - report a snapshot of the current processes. 选项: -A:显示所有进程与-e相同的效果 -a:不与终端相关的所有进程 -u:与用户相关的进程 -x:通常和a,u结合使用,显示出来比较全面的信息 -f:做一个更为完整的输出 常用的组合:     ps -ef 以完整的信息显示所有进程信息   

Htop – Linux进程监控工具

Htop 是一个非常高级的交互式的实时linux进程监控工具. 它和top命令十分相似,但是它具有更丰富的特性,例如用户可以友好地管理进程,快捷键,垂直和水平方式显示进程等等. Htop是一个第三方工具,它不包含在linux系统中,你需要使用YUM包管理工具去安装它. 一,以rpm包方式安装htop 1,配置yum源 -------------- For RHEL/CentOS 7 -------------- # wget http://pkgs.repoforge.org/rpmforge-

Linux系统--Linux进程与作业管理(2)

Linux系统--Linux进程与作业管理(2) Linux进程相关的基本概念已经了解,Linux进程管理的一些命令: pstree,ps,pidof,pgrep,top,htop,glance,pmap,vmstat,dstat,kill,pkil,job,bg,fg,nohup 1.pstree命令: pstree - display a tree of processes:以树状形式显示当前系统进程,和命令tree相似. 2.ps命令: ps - report a snapshot of 

Linux进程控制(一)

1. Linux进程概述 进程是一个程序一次执行的过程,它和程序有本质区别.程序是静态的,它是一些保存在磁盘上的指令的有序集合:而进程是一个动态的概念,它是一个运行着的程序,包含了进程的动态创建.调度和消亡的过程,是Linux的基本调度单位.那么从系统的角度看如何描述并表示它的变化呢?在这里,是通过进程控制块(PCB)来描述的.进程控制块包含了进程的描述信息.控制信息以及资源信息,它是进程的一个静态描述. 内核使用进程来控制对CPU和其他系统资源的访问,并且使用进程来决定在CPU上运行哪个程序,