线程共享全局变量和私有全局变量

共享全局变量实例:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
int key=100;
void *helloworld_one(char *argc)
{
    printf("the message is %s\n",argc);
    key=10;
    printf("key=%d, the child is %u\n",key,pthread_self());
    return 0;
}

void *helloworld_two(char *argc)
{
    printf("the message is %s\n",argc);
    sleep(1);
    printf("key=%d, the child is %u\n",key,pthread_self());
}

int main()
{
    pthread_t thread_id_one;
    pthread_t thread_id_two;
    pthread_create(&thread_id_one,NULL,helloworld_one,"helloworld");
    pthread_create(&thread_id_two,NULL,helloworld_two,"helloworld");
    pthread_join(thread_id_one,NULL);
    pthread_join(thread_id_two,NULL);
    return 0;
}

#include <stdio.h>
#include <pthread.h>
pthread_key_t key;

void echomsg(void *t)
{
    printf("destructor excuted in thread %u, param=%u\n",pthread_self(),(int *)t);
}

void *child1(void *arg)
{
    int i=10;
    int tid=pthread_self();
    printf("\nset key value %d in thread %u\n",i,tid);
    pthread_setspecific(key,&i);
    printf("thread one sleep 2 until thread two finish\n");
    sleep(2);
    printf("\nthread %u returns %d, add is %u\n",tid,*(int *)pthread_getspecific(key),(int *)pthread_getspecific(key));

}

void *child2(void *arg)
{
    int temp=20;
    int tid=pthread_self();
    printf("\nset key value %d in thread %u\n",temp,tid);
    pthread_setspecific(key,&temp);
    sleep(1);
    printf("thread %u returns %d,add is %u\n",tid,*(int *)pthread_getspecific(key),(int *)pthread_getspecific(key));
}

int main()
{
    pthread_t tid1,tid2;
    pthread_key_create(&key,echomsg);
    pthread_create(&tid1,NULL,(void *)child1,NULL);
    pthread_create(&tid2,NULL,(void *)child2,NULL);
    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
    return 0;
}

从运行结果来看,各线程对自己的私有数据操作互相不影响,虽然同名全局,但访问的内存空间并不是同一个。

线程共享全局变量和私有全局变量,布布扣,bubuko.com

时间: 2024-08-04 19:43:30

线程共享全局变量和私有全局变量的相关文章

进程与线程---------共享与私有

进程process:             是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例. 同一程序可产生多个进程(一对多关系),以允许同时有多位用户运行同一 程序,却不会相冲突. 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程thread:            是操作系统能够进行运算调度的最小单位.是独立调度和分派的基本单位. 一条线程指的是进程中一个单一

线程的共享资源和私有资源

转自:http://blog.sina.com.cn/s/blog_798f21a0010108t0.html ———————————————————————————————————————————————————————— 线程共享的环境包括:进程代码段.进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯).进程打开的文件描述符.信号的处理器.进程的当前目录和进程用户ID与进程组ID.     进程拥有这许多共性的同时,还拥有自己的个性.有了这些个性,线程才能实现并发性.这些个

同一进程间的线程共享资源

线程共享的环境包括: 1.进程代码段 2.进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯) 3.进程打开的文件描述符.信号的处理器.进程的当前目录和进程用户ID与进程组ID. 进程拥有这许多共性的同时,还拥有自己的个性.有了这些个性,线程才能实现并发性.这些个性包括: 1.线程ID      每个线程都有自己的线程ID,这个ID在本进程中是唯一的.进程用此来标识线程. 2.寄存器组的值      由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线程切换到另一个线

实例变量,局部变量,全局变量,静态全局变量

摘抄网上的 定义: 实例变量:定义在一个类的各个内部方法之外,是内部方法共享的变量 局部变量:定义在方法之中的变量,但是这个方法使用的变量,其他方法和类没法使用. 全局变量:也称为外部变量,它是在函数外部定义的变量,一个程序的所有的java源文件都可用. 静态全局变量:一程序由多个java源文件组成时,可以用静态全局变量指定某一个java源文件,仅这个java文件可用这变量. 1 int a,b; //外部变量 2 static int c;//静态外部变量 3 4 public class S

「每日五分钟,玩转JVM」:线程共享区

前言 上一篇中,我们了解了JVM中的线程独占区,这节课我们就来了解一下JVM中的线程共享区,JVM中的线程共享区是跟随JVM启动时一起创建的,包括堆(Heap)和方法区()两部分,而线程独占区的程序计数器,虚拟机栈,本地方法栈的生命周期都是跟随线程的,随线程的创建而诞生,随线程的销毁而销毁. 堆(Heap) 堆内存作为JVM管理的内存中最大的一块,用于存放我们的对象实例,我们经常会把JVM的内存简单的分为堆内存和栈内存,这样说虽然有些片面,但是也有这么说的道理,这两块儿一个作为执行程序的,一个作

并发编程之线程共享和协作(一)

更多Android架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从以下几个内容来阐述线程共享和协作: [基础概念之CPU核心数.线程数,时间片轮转机制解读][线程之间的共享][线程间的协作] 一.基础概念 CPU核心数.线程数两者的关系:cpu的核心数与线程数是1:1的关系,例如一个8核的cpu,支持8个线程同时运行.但在intel引入超线程技术以后,cpu与线程数的关系就变成了1:2.此外在开发过程中并没感觉到线程的限制,那是因为cp

static全局变量与普通的全局变量的区别

(1)static全局变量与普通的全局变量有什么区别?(2)static局部变量和普通局部变量有什么区别?(3)static函数与普通函数作用域有什么不同?(4)static函数与普通函数有什么区别? (1)static全局变量与普通的全局变量有什么区别?答:全局变量的说明之前再加以static 就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式.这两者在存储方式上并无不同.这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,

同一进程中的线程共享的资源有哪些 转载

转自:http://blog.csdn.net/shuilan0066/article/details/7683315 线程共享的环境包括:进程代码段.进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯).进程打开的文件描述符.信号的处理器.进程的当前目录和进程用户ID与进程组ID. 进程拥有这许多共性的同时,还拥有自己的个性.有了这些个性,线程才能实现并发性.这些个性包括: 1.线程ID       每个线程都有自己的线程ID,这个ID在本进程中是唯一的.进程用此来标 识线程.

多线程06-多线程共享数据的方式(经验小结)

1.案例分析-01 通过代码实现火车票出售的例子 在实现代码之前先对问题进行分析:火车票出售应该是在多个窗口进行的(即多个线程),以一个车的班次来说,该班次的火车票张数即为多个窗口共享的数据 即这份共享数据为出售特定班次的火车票,这个动作在多个窗口都是不变的,变更的只有火车票的剩余张数.代码实现如下: package org.lkl.thead; /** * * Function : 多线程共享数据 * * @author : Liaokailin CreateDate : 2014-6-13