threads 2-局部变量和全局变量

2024-01-21 19:32

本文主要是介绍threads 2-局部变量和全局变量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

main里面定义的变量都是属于主线程的
主线程创建的子线程不能访问之
需用全局变量进行线程间通信
[root@localhost ch12]# cat test4.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>void* thread_function(void *arg);
void *thread_result;char *str="hello";
int flag=0;
int main()
{
puts(str);
int res;
pthread_t a_thread;
res=pthread_create(&a_thread,NULL,&thread_function,NULL);
if(res!=0){perror("pthread_create error");exit(EXIT_FAILURE);		}
printf("already create a thread\n");res = pthread_join(a_thread, &thread_result);
puts(str);
}void* thread_function(void *arg)
{
str="hi";
puts(str);
pthread_exit("thanks");
}[root@localhost ch12]# 
[root@localhost ch12]# make test4
cc -D_REENTRANT  -lpthread  test4.c   -o test4
[root@localhost ch12]# ./test4
hello
already create a thread
hi
hi
如果将line 11 ,char *str="hello";放到main里面
则编译不会通过
[root@localhost ch12]# make test4
cc -D_REENTRANT  -lpthread  test4.c   -o test4
test4.c: In function ‘thread_function’:
test4.c:31:1: error: ‘str’ undeclared (first use in this function)
test4.c:31:1: note: each undeclared identifier is reported only once for each function it appears in
make: *** [test4] Error 1
局部变量虽然不可以如此明目张胆的通信---被编译器揪出来le
但可冒充pthread_create的参数来进行父子线程的数据交换,如下
[root@localhost ch12]# cat test4.c 
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>void* thread_function(void *arg);
void *thread_result;int flag=0;
int main()
{
char str[]="hello";
puts(str);
int res;
pthread_t a_thread;
res=pthread_create(&a_thread,NULL,&thread_function,str);
if(res!=0){perror("pthread_create error");exit(EXIT_FAILURE);		}
printf("already create a thread\n");res = pthread_join(a_thread, &thread_result);
puts(str);
}void* thread_function(void *arg)
{
strcpy(arg, "hi");
puts(arg);
pthread_exit("thanks");
}[root@localhost ch12]# make test4
cc -D_REENTRANT  -lpthread  test4.c   -o test4
[root@localhost ch12]# ./test4
hello
already create a thread
hi
hi
定义主线程的局部变量str,充当pthread_create的参数传递给子线程,传的是地址
,以至于在子线程中修改了str,主线程中也可得知
也可单向传递,主线程-->子线程,即传值,如下
[root@localhost ch12]# cat test4.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>void* thread_function(void *arg);
void *thread_result;int flag=0;
int main()
{
char *str="hello";
puts(str);
int res;
pthread_t a_thread;
res=pthread_create(&a_thread,NULL,&thread_function,str);
if(res!=0){perror("pthread_create error");exit(EXIT_FAILURE);		}
printf("already create a thread\n");res = pthread_join(a_thread, &thread_result);
puts(str);
}void* thread_function(void *arg)
{
arg="hi";
puts(arg);
pthread_exit("thanks");
}[root@localhost ch12]# make test4
cc -D_REENTRANT  -lpthread  test4.c   -o test4
[root@localhost ch12]# ./test4
hello
already create a thread
hi
hello
可见在主线程中第二次打印的str仍然是hello
下面是pthread_create的原型
[root@localhost ch12]# man 3 pthread_create
       #include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);


这篇关于threads 2-局部变量和全局变量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/630598

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

在实现回显功能模块的时候,把ID设置成全局变量了

在hsapprove.jsp中: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><script type="text/javascript">function edittodayhs(hsid){//alert(hsid);//

支付后全局变量改变

if (router.query.recharge_back_URI) {const _url = decodeURIComponent(router.query.recharge_back_URI as string);const url = new URL(_url, location.href);if (url.origin === location.origin) {router.repl

about mutil-threads

http://wenku.baidu.com/link?url=2mpkrn3dKiYjaT8f1kY5oI2Srnpr-gCyYSP-UfaXOMARAZCRx3v7gg41PcWYR8VNyEOkM2gQ3Nr862Spoq4SEnd-WQkhHcCZGmGUurcZbs3

ThreadLocal: Java中的线程局部变量

在多线程编程中,确保数据的线程安全是一个重要的考虑因素。Java 提供了多种机制来处理线程安全问题,其中 ThreadLocal 是一种简单而强大的工具,用于创建线程局部变量,从而避免了同步操作的开销。本文将详细介绍 ThreadLocal 的概念、使用场景、最佳实践以及如何避免潜在的问题。 什么是ThreadLocal? ThreadLocal 是 Java 提供的一个类,它允许线程拥有自己

带你速通C语言——局部与全局变量(15)

全局变量和局部变量在 C 程序设计中具有非常重要的角色,它们决定了变量的可见性、生命周期和作用域。理解它们之间的区别是编写有效和可维护代码的关键。 1.局部变量 局部变量是在函数或代码块内部定义的变量。它们的生命周期仅限于包含它们的代码块或函数体: 作用域:局部变量只在定义它们的函数或代码块内部可见。生命周期:当函数调用结束后,局部变量所占用的内存被释放。初始化:局部变量不会自动初始化

java中成员变量、局部变量、静态变量的区别

成员变量和局部变量的区别        成员变量:           ①成员变量定义在类中,在整个类中都可以被访问。           ②成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。           ③成员变量有默认初始化值。       局部变量:           ①局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有

Linux中全局变量配置,/etc/profile.d还是/etc/profile

全局环境变量可以放在 /etc/profile 或 /etc/profile.d/ 中,但两者的使用方式和目的有所不同: /etc/profile 作用: /etc/profile 是一个系统范围的启动脚本,在用户登录时执行。它主要用于设置全局环境变量和配置,适用于所有用户。 适用情况: 当你需要在所有用户登录时设置全局环境变量或其他全局配置时,可以将这些设置放在 /etc/profile

【jvm】局部变量表与GCRoots之间的关系

目录 1. 说明2. GC Roots的概念3. 局部变量表的作用4. 局部变量表与GC Roots的关系 1. 说明 1.局部变量表与GC Roots的关系主要体现在:局部变量表中的引用是GC Roots的一个重要组成部分,它们决定了哪些对象在垃圾收集过程中是可达的。2.通过理解这种关系,我们可以更好地控制Java程序中的内存使用,避免内存泄漏和内存溢出等问题。 2.