c++线程创建传递的参数发生改变

看看如下代码,觉得输出会是什么?

 1 #include "stdafx.h"
 2 #include <windows.h>
 3 #include <iostream>
 4 using namespace std;
 5
 6 DWORD WINAPI Func(LPVOID p);
 7 typedef struct
 8 {
 9     int firstArgu;
10     long secArgu;
11
12 }MyType;
13
14
15
16 void  test()
17 {
18     MyType MyTypeArgu={0};
19     MyTypeArgu.firstArgu=1;
20     MyTypeArgu.secArgu=1;
21     CreateThread(NULL,0,Func,&MyTypeArgu,0,NULL);    //Sleep(1000);
22 }
23
24 void main()
25 {
26     test();
27     system("pause");
28 }
29 DWORD WINAPI Func(LPVOID p)
30 {
31     MyType* param=(MyType*)p;
32     int   intValue=param->firstArgu;
33     long longValue=param->secArgu;
34     cout <<"firstArgu="<<intValue<<endl<<"secArgu="<<longValue<<"."<<endl;
35     cout<<"请等待……"<<endl<<endl;
36     return 0;
37 }

最终的输出结果其实并不确定。

并不是输出

firstArgu=1
secArgu=1关键是CreateThread创建线程之后,将指针传递给线程方法后,test方法就退出了,就会将MyType的内存释放了,导致线程再接受到指针后,访问内存,却不是原来的数据了。如果想要输出正确的结果,只需将//Sleep(1000)注释取消,等待线程方法访问之后,再退出就可以了。
时间: 2024-11-09 21:22:53

c++线程创建传递的参数发生改变的相关文章

015 线程创建

线程  ● 进程启动 ○ 进程内核对象 进程空间 ○ 线程 ● 可以通过IDE设置入口函数 ● 自己创建线程 ○ 创建线程函数 CreateThread() ○ 新建线程内核对象(结构体) ● 线程 ○ 分配一块内存空间,作为当前线程的堆栈 ○ 两条在同一进程内线程,都是隔离的 ○ 线程他们是封闭的,每个线程都有自己的一个堆栈 ○ 但是都是属于当前进程内的堆栈 ○ 进程赋予了线程交互的能力 ● 线程创建 1 HANDLE WINAPI CreateThread( 2 _In_opt_ LPSEC

[存]Jmeter 如何实现跨线程组传递参数

此文来源与组里小白的分享~ Jmeter 如何实现跨线程组传递参数(以传递token为例)   1.首先选择一个登陆接口(线程组1),添加正则表达式提取器提取token,接着再添加一个后置处理器BeanShell PostProcessor 2.BeanShell PostProcessor中参数项输入引用变量${token};脚本项输入动作语句${__setProperty(token1,${token},)}; 3.在线程组2添加一个前置处理器BeanShell PreProcessor 4

向线程函数传递参数

向线程函数传递参数在构造线程对象时即可完成.但是要记住,默认情况下是把参数拷贝到线程内部,即使在函数中使用的是引用.例如 void f(int i,std::string const &s); std::thread t(f,3,"hello");</span> 上面代码中,函数f的第二个参数是std::string,传递的是char const *会转换为string. 当使用指针指向自动变量时,要特别注意: <span style="font-s

Jmeter 跨线程组传递参数 之两种方法

终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直到登录接口的参数失效了,需再次发送一次登录接口,又可以多次使用其参数,下面举例子: 1.登录接口中利用 Json Path Extractor 获取到登录接口的响应参数,(怎么获取上一节讲过) 终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为

Net线程足迹 传递参数至线程

方法一:应用ParameterizedThreadStart这个委托来传递输入参数,这种方法适用于传递单个参数的情况. [c-sharp] view plaincopy using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using Sys

Linux线程体传递参数的方法详解

传递参数的两种方法 线程函数只有一个参数的情况:直接定义一个变量通过应用传给线程函数. 例子 #include #include using namespace std; pthread_t thread; void * fn(void *arg) { int i = *(int *)arg; cout<<"i = "<<i<<endl; return ((void *)0); } int main() { int err1; int i=10; e

jmeter中线程之间传递参数

JMeter 变量作用域局限于所属线程.这样设计是经过深思熟虑的,目的是让测试线程能够独立运转.有时候用户可能需要在不同线程间(可能属于同一个线程组,也可能不属于同一个线程组)传递变量. 其中一种方法就是使用属性.属性为所有 JMeter 线程所共享,因此当某个线程设置一个属性后,其他线程就可以读取更新后的值. 如果存在大量数据需要在线程间传递,那么可以考虑使用文件.例如,测试人员可以在一个线程中使用监听器,保存响应到文件(Save Responses to a file )或者 BeanShe

11.4 线程创建

传统UNIX程序模型中每一个进程都只支持一个线程控制,在概念上,这与每个线程仅仅由一个线程组成的线程模型是一样的.采用pthreads以后,当一个程序运行的时候,系统也会启动一个单线程控制进程,当程序运行的时候,其行为与传统进程并没有什么明显区别,除非它创建了多线程控制,其他线程可以通过调用函数pthread_create来创建. #include <pthread.h> int pthread_create(pthread_t *restrict tidp, const pthread_at

多线程【Thread、线程创建】

主线程:执行主方法的线程,就叫做主线程 单线程程序:程序从mani开始从上到下依次运行 程序从main方法开始运行,JVM运行main方法,会找操作系统 开辟一条通向cpu的执行路径,cpu可以通过这条路径来执行main方法 这条路径有一个名字叫主(main)线程 创建线程方式一继承Thread类 实现步骤: 1.创建Thread类的子类 2.重写Thread类中的run方法,设置线程的任务 3.创建Thread类的子类对象 4.调用Thread类中的start方法开启一个新的线程,执行run方