1个争用资源的简单线程小例子

main()本身就是一线程,现在在main内部再创建另一个线程,

例子只是简单的在两个线程中打印了一下TID和PID以及获取本身PID,当然两个线程的TID是一样的,PID是不一样的。

这里主要说的是:两个线程一起运行,屏幕上显示的各线程的内容,因为一起争用资源,造成了打印信息内容的重叠。

代码:

#include <iostream>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
using namespace std;
void *thread_func(void *arg);

pthread_t tid;

void *thread_func(void *arg)
{
        cout<<"NewThread : PID="<<getpid()<<", TID="<<tid<<", pthread_self()="<<pthread_self()<<endl;
        pthread_exit(NULL); //退出线程(actived)
}

int main()
{
        //pthread_t tid;
        if (pthread_create(&tid, NULL, thread_func, NULL) != 0)
        {
                cout<<"Create thread error\n";
                exit(1);
        }
        cout<<"MainThread: PID="<<getpid()<<", TID="<<tid<<", pthread_self()="<<pthread_self()<<endl;

        sleep(2);
        return 0;
}

输出结果:

[[email protected] thread]# ./a.out

MainThread: PID=NewThread : PID=5597155971, TID=, TID=139748750608128, pthread_self()=139748750608128139748750616352, pthread_self()=139748750608128

[[email protected] thread]# ./a.out
MainThread: PID=56049, TID=140537922148096, pthread_self()=140537922156320NewThread : PID=56049, TID=
140537922148096, pthread_self()=140537922148096

[[email protected] thread]# ./a.out
MainThread: PID=56053, TID=140158878066432, pthread_self()=140158878074656
NewThread : PID=56053, TID=140158878066432, pthread_self()=140158878066432

结论:

在多线程中使用同一资源时,如果线程的执行过程不是原子操作,那么它在执行过程中随时会被其它线程中断,然后等到其再拥有资源权限时,再继续执行剩下的操作。

时间: 2024-10-31 14:22:20

1个争用资源的简单线程小例子的相关文章

Spring简单的小例子SpringDemo,用于初略理解什么是Spring以及JavaBean的一些概念

一.开发前的准备 两个开发包spring-framework-3.1.1.RELEASE-with-docs.zip和commons-logging-1.2-bin.zip,将它们解压,然后把Spring开发包下dist目录的所有包和commons-logging包下的commons-logging-1.1.1.jar复制到名为Spring3.1.1的文件夹下.那么Spring开发所需要的包就组织好了. 二.建立项目,导入包 在项目节点上右键,Build Path/ADD Libraries/U

一个简单的小例子让你明白c#中的委托-终于懂了!

模拟主持人发布一个问题,由多个嘉宾来回答这个问题. 分析:从需求中抽出Host (主持人) 类和Guests (嘉宾) 类. 作为问题的发布者,Host不知道问题如何解答.因此它只能发布这个事件,将事件委托给多个嘉宾去处理.因此在Host 类定义事件,在Guests类中定义事件的响应方法.通过多番委托的"+="将响应方法添加到事件列表中,最终 Host 类将触发这个事件.实现过程如下: 代码其实很少下面贴出来所有代码: QuestionArgs.cs view plaincopy to

vuex在组件化开发中的简单应用小例子

首先, 介绍一下vuex是个什么东西, 个人理解来说, vuex就是一个状态管理的东西, 它里面有且仅有一个Store仓库, 这个仓库里面存放着一些变量, 为什么要有这么一个变量呢, 用过vue的人肯定都清除, 父子组件之间的通讯传值是个比较麻烦的事情, 特别是, 嵌套组件特别多的时候, 这种情况下, 一级一级地传递下去十分麻烦, 还有就是兄弟组件之间的传值也一样麻烦. 而vuex中的Store这个仓库, 就能够为我们将放在这个仓库中的值, 分发给整个项目下的所有组件, 也就是说是, 不用一级一

java入门---简介&amp;简单输出小例子&amp;开发前准备

    Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式推出.Java分为三个体系: JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版) JavaEE(J2EE)(Java 2 Platform,Enterprise Edition,java平台企业版) JavaME(J2ME)(Java 2 Plat

一个Java线程小例子(仿火车票售卖)

public class MyThread extends Thread{ private static int ticket=100; public void run(){ for(int i=0;i<50;i++) if(ticket>0) System.out.println(Thread.currentThread().getName()+"正在卖第"+(ticket--)+"张票"); } //main函数是一个主线程 public stati

一个强悍的极简单递归小例子帮你从程序执行的角度理解递归

1 public class test { 2 public static void main(String[] args) { 3 swap(3); 4 } 5 public static int i=1; //全局变量 6 public static void swap(int a){ //局部变量 7 if(a>0){ 8 a--; 9 System.out.println("第"+i+"层:"); 10 System.out.println("

超简单的通过年月得到当月天数,从简单的小例子来解析代码的优化

首先分析问题,通过年月得到当前月份的天数,按照生活中的惯性,就是分析年份,后分析月份,这里我要说不,虽然这样同样可以算出结果,速度上也与先判断月份相差毫微,虽然这个时间短的可以忽略不计,但是作为一个有情怀的程序员,对代码的要求就是要短小精悍,能省就省,我先列出两种分析方式的算法代码,当然这种写法是最笨重的,这里主要是为了突出问题,优化一步步来,我始终强调,先分析问题,只要会写代码的程序员写完立马就会改为方式二的写法,因为在代码量上很直观,一眼就能看的清楚: 先判断年份的写法: public st

maven+springmvc+cxf 实现简单webservice小例子

1.首先你需要创建一个maven项目[当然是web项目] 2.pom.xml添加以下 <properties> <cxf.version>2.2.3</cxf.version></properties> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <v

超简单的小例子揭开机器数的奥秘——原码、反码、补码、移码

各种数值在计算机中的表示形式称为机器数,机器数采用二进制数来表示数据,数据的正负号也分别用0和1来表示.为了便于运算,带符号的机器数可采用原码.反码.补码.移码等编码方法. 注:以下规则均以机器字长为8(即采用8个二进制位来表示数据)来举例说明. 原码 ⊙正数:如下图①先写上要表示的数据,②符号位(首位)写上0,③如果有空位则用0补上,如X=22=10110B,则[X]原=00010110: ⊙负数:如下图①先写上要表示的数据,②首位写上1,③如果有空位则用0补上,如X=-27=-11011B,