




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、同学们在多线程编程时遇到的问题整理(1)如何根据文本文件大小,#include <iostream>最后更新时间:2011-12-7 动态创建一个字符数组存放文本文件?#include <fstream> using namespace std;char* textbuf; 定义一*个 char*型指针int main(int argc, char* argv)ifstream infile;int nfilelen;infile.openctext.txt"); 打开一个文件if(!infile) cout«"file open erro
2、r."«endl; infile.seekg(0,ios:end); 把文件读写指针移到文件末尾nfilelen = infile.tellgo; /获取文件长度infile, seekg (0,ios:beg); 把文件读写指针移到文件的起始位置textbuf= new charnfilelen+lj; /根据文件长度,动态申请一块内存,多加一个字节,存 放winfile»textbuf; 把文件内容读入该内存屮cout«texlbuf«endl;return 0;这段代码看似正确,但是,如果文件中有空格和换行,则发现读出的内容仅是文件的一部
3、 分,即从文件第一个字节到文件中第一个空格或换行符出现位置。这是因为 “infile»textbuf;”的特点,它能够读取连续的字符,直至遇到空格或换行符为止。但是文件屮都有空格或换行,怎么才能一次读入所有内容呢?用ainfile.read(textbuf, nfilelen);”代替“infile»textbuf;”。read()方法不区分任何字符的读入内容,最多可读入 变量nfilelen指定的字符数,而且不会在读入字符的末尾自动加,(f,如果你需要把读入内 容变成真正的字符串,需要自己编程在末尾加,w,否则,你不能用”coutvv textbup输出读 入的内容。#i
4、nclude <iostreem#include <fstream>using namespace std;char* textbuf;/定义个char型指针int main(int argc, char* argv)ifstream infile;int nfilelen;infile. open ("text. txt") ;/打开一个文件if (! infile) cout<open error . n<<endl; infile . seekg (oz ios : : end) ;/把文件读写指针移到文件末尾nfilelen =
5、infile . tellg(); /获取文件长度infile . seekg (0, ios : :beg) ;/把文件读写指针移到文件的起始位置textbuf= new char nfilelen + 1 ; /根据文件长度,动态申请一块内存,多加一个 字节,存放infile . read (textbuf z nfilelen) ;/把文i:内容读入该内存中textbufnfilelen = *0'cout<extbuf<<endl;return 0;(2) 如何保证创建的子线程运行完毕后,再在主线程中进行统计工作? 参考下面“最后更新时间:2011117”的文
6、档。(3) 如何在创建子线程时,给子线程函数传递参数,从而实现不同的线程完 成任务的不同部分?参考下面“最后更新时间:2011109”的文档。同学们在多线程编程时遇到的问题整理最后更新时间:2011-11-7(1)我的程序到底错在哪里?#include hwindows.hu #include nprocess.hn#include <iostream.h># include <stdio.h>handle hmutex;unsigned int _stdcall thread 1 (void* p)int i,j;for(i=0;i<5;i+)waitforsi
7、ngleobject(hmutexjnfinite);for(j=0;j<5;j+) cout«nin threadl.h«endl;releasemutex(hmiitex);return 0;unsigned int _stdcall thread2(void* p)int i,j;for(i=0;i<5;i+)waitforsingleobject(hmutex,infinite);for(j=0;j<5;j+) cout«nin thread2.n«endl;releasemutex(hmutex);return 0;void
8、main(int argc,char* argv)handle hthread2;unsigned threadid2;hmutex=createmutex(null,false,null);cout«ncreating threadl"«endl; hthreado=(handle)_beginthreadex(null,o, thread 1 ,null,0,&threadido);cout«"creating thread2"«endl;hthread 1 =(handle)_beginthreadex(nul
9、l,o, thread2,null,0,&thieadidl);cout«ufinished.nh;closehandle(hthread0);closehtindle(hthread 1 );在主函数屮建立了两个线程,每个线程会输出一些信息,但是运行后,发现运行结果跟预想 的不一样,到底错在哪里?我建立的线程到底运行了没有呢? ?如果运行了,为什么没有输 出正确的结果呢? ?如果没运行,到底我的程序错在哪里了呢? ?(2) 为了验证我的线程是否建立了,我得让程序暂停一下,然后通过任务管理 器查看我的程序中是否生成了两个子线程。于是,我把程序稍微修改一下,在 cout
10、1;nfinished.nn;后面加了一句getchar();让程序停在这里,等待我输入。cout«hfinished.nh;getchar();closehandle(hthread0);closehandle(hthread 1 );再次运行我的程序,发现输出结果竟然变化了!? ?发现两个子进程中的内容 能够显示了。难道,getcharo®数如此神奇?还是我的程序另有错误? ?(3) 思考,为什么加上getchar()以后,程序的输出就正确了?我们再次审视程序1,发现main函数屮创建两个子线程后,接下来的语句是 cout«"finished.n&q
11、uot;closehandle(hthread0);closehandle(hthread 1 );联系课本上的内容,线程是能够为os独立调度的执行实体,也就是说,主线程main中创 建两个子线程后,我们的程序中就有了三个能够被os独立调度执行的单元,分别是主线程、 子线程1和子线程2,如果接下來os调度主线程继续执行,那么,主线程将执行 cout«ufinished.nh;closehandle(hthread0);closehtindle(hthread 1 );这几个语句执行的很快,执行完毕后,主线程就退出了,这个时候可能两个可怜的子线程 还没来得及运行过一次,主线程退出的时候
12、,会调用系统函数结束整个进程的运行【这是 编译器自动给我们的程序加入的结束代码】,而进程一旦结束了,那么进程中的其他子线程 也就随之结束了。所以,也就看不到执行结果了。原来是这样子!那我的程序该怎么修改呢?容易,只要把程序逻辑改为“等子线程都运行完 毕后,主线程才结朿”就行啦。在coutvv“finished.n“;之前加上下面的语句就搞定了。waitforsingleobject(hthread0, infinite);waitforsingleobject(hthread 1 , infinite);waitforsingleobject ()是一个神奇的函数,它可以用来等待一个线程或进程
13、的结束,也可 以等待mutex, semaphore和event同步对象,而且它们的等待含义是不一样的。大家要注意理解和区分。到此,代码能够正确运行了,所有的代码如下:#include nwindows.hn#include mprocess.hh#include <iostream.h># include <stdio.h>handle hmutex;unsigned int _stdcall thread 1 (void* p)int i,j;for(i=0;i<5;i+)waitforsingleobject(hmutexjnfinite);for0=0;j
14、<5;j+) cout«uin threadl.m«endl;releasemutex(hmutex);return 0;unsigned int stdcall thread2(void* p)int i,j;for(i=0;i<5;i+)waitforsingleobject(hmutexjnfinite);for(j=0;j<5;j+) cout«nin thread2.n«endl;releasemutex(hmutex);return 0;void main(int argc,char* argv)handle hthread
15、2;unsigned threadid2j;hmutex=createmutex(null,false,null);cout«"creating threadl"«endl; hthreado=(handle)_beginthreadex(null,o, thread 1 ,null,0,&threadido);colit«"creating thread2"«endl;hthread 1 =(handle)_beginthreadex(null,o, thread2,null,0,&thieadi
16、dl);cout«ufinished.nm;waitforsingleobject(hthread0,infinite);waitforsingleobject(hthreadfl,infinite);closehandle(hthread0);closehandle(hthread 1);同学们在多线程编程时遇到的问题整理更新时间:2011-10-9(1)给线程函数传递参数时,传递的是参数的指针,所以,要保证该线程执行时,该参数 的值不会被改变,而且该参数仍然有效。下面的代码不正确,因为,在for循环屮,每次param 变量的值都在变动。从而使得线程通过指针拿到的param的值不是
17、你初始吋想传给线程的 值,而是param变量当前的值,该值已经被你重新赋值了。struct prcoparam int wail_lime;int goods_num;int threadid;;unsigned _stdcall firstthreadfunc(void * arg)procparam *param;param = (procparam*)arg;printf(“d %d %d' param->wait_time, param->goods_num, param->threadid);return 0;int main () procparam pa
18、ram;for(i=0;i<9;i+)param.wait_time = (i+1)*10;param.goods_num = (i+l)*2;param.threadid = i+1;hthreadi = (handle)_beginthreadex(null, 0, firstthreadfunc, (void*)¶m, 0, & threadidfi);代码修改方法如下:先定义一个param数组,数组的每个单元存放一个对应线程的参数struct prcoparam)int wait_time;int goods_num;int threadid;unsigned _stdcall firstthreadfunc(void * arg)procparam *param;param = (procparam*)arg;printf(44%d %d %cf param->wait_time, param->goods_num, param->thre
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河南省许昌市建安区第三高中2026届化学高二第一学期期末达标检测模拟试题含答案
- 四川省达州市开江县普安中学2024-2025学年七年级下学期第三次月考数学试卷(含答案)
- 汉字录入课件
- 北师大版五年级上册数学期末检测卷(无答案)
- Unit1 Friendship单元综合测评卷(含答案)译林版(2024)八年级英语上册
- 3DMAX基础建模知到智慧树答案
- 《企业财务会计》知到智慧树答案
- 电子游戏安全风险防范策略
- “两山”之光:理论与实践知到智慧树答案
- 军事理论(四川卫生康复职业学院)知到智慧树答案
- GB/T 9869.2-2025橡胶用硫化仪测定硫化特性第2部分:圆盘振荡硫化仪
- 保密教育培训课件内容
- 陕西省专业技术人员继续教育2025公需课《党的二十届三中全会精神解读与高质量发展》20学时题库及答案
- 2024-2025学年人教版数学五年级下学期期末试卷(含答案)
- 采气工技能操作题库
- 贵州省遵义市红花岗区小升初数学试卷
- 高压氧治疗相关知识
- 外科学麻醉专题知识讲座培训课件
- 课程设计与评价
- 霍尔电流传感器实训台课件
- 2023年国药控股股份有限公司招聘笔试题库及答案解析
评论
0/150
提交评论