下列C算法描述了线程函数的创建和调用,请参考文献注释注释内容给出程序运行结果。

C/C++&简单的多线程编程
C/C++&简单的多线程编程
  #include &windows.h& //『注意1』由于CreateThread()是API函数,所以,必须包含这个头文件
  #include &iostream&
  DWORD WINAPI Thread1Proc( LPVOID lpParameter); //线程的执行函数
  DWORD WINAPI Thread2Proc( LPVOID lpParameter); //线程的执行函数
  int temp(0);
  int sum(0);
  int main()
  HANDLE hThread1=CreateThread(NULL,0,Thread1Proc,NULL,0,NULL); //『注意2』创建线程1
  HANDLE hThread2=CreateThread(NULL,0,Thread2Proc,NULL,0,NULL); //创建线程2
  CloseHandle(hThread1); //关闭标识线程1的句柄
  CloseHandle(hThread2); //关闭标识线程2的句柄
  Sleep(5); //『注意3』主线程放弃执行权,睡眠毫秒,以使线程和线程得到执行机会
  sum= //主线程的执行语句
  cout&&"sum="&&sum&& //主线程的执行语句
  return 0;
  DWORD WINAPI Thread1Proc( LPVOID lpParameter)
  temp=a+b;
  return 0;
  DWORD WINAPI Thread2Proc( LPVOID lpParameter)
  temp+=c;
  return 0;
  代码说明:本代码简单演示了多线程的创建方法。程序用包括主线程在内的三个线程共同完成sum=a+b+c并输出计算结果的功能。其中,线程1完成a+b这一步,线程2完成将a+b的结果与c相加这一步,主线程完成输出计算结果这一步。整个程序很简单,一目了然,但是,依然有几个地方需要注意:
  「注意1」由于创建线程所使用的函数CreateThread()是windows API函数,所以,必须包含头文件windows.h
  「注意2」CreateThread()函数有一个HANDLE 类型的返回值,用来标识创建的线程,因此,应该定义一个HANDLE类型的变量用于保存这个句柄(不是必须)。线程创建完成之后,如果不需要使用这个句柄变量,应当将其关闭,以释放系统资源。关闭句柄的方法是调用CloseHandle()函数。
  「注意3」这里的Sleep()函数的作用是使主线程放弃执行机会,让其它线程开始执行。因为这个程序主线程内运行的代码很短,就两条短语句,同常情况,这两条语句在一个系统时间片内就能跑完,然后就执行return语句返回,主线程就运行结束了。主线程一结束,程序就终止,线程1和线程2将再也得不到执行机会。我们可以将Sleep()注释起来,然后运行程序,观察打印出来的sum值即可以发现线程1和线程2是否得到运行机会。当然,Sleep()不是必须的,这从系统调度线程的方式可以看出来,多线程程序在开始运行时,系统会首先让主线程执行一段时间(时间片),如果主线程在这个时间段内将所有代码都执行完了,程序就结束,否则,就将主线程挂起,然后让其他线程执行同样的一段时间,时间到了之后,该线程挂起,又返回主线程开始执行,主线程再执行同样的一段时间,然后再挂起,跳到其他线程执行,如此不断循环,直到主线程完全执行完毕为止。由此可见,要想让非主线程能够被完整执行,那么只要使它获得的时间片的总和大于或等于该线程连续执行完毕所需要的时间即可。基于此原理,我们想到,只要让主线程被多次挂起即可使非主线程获得多个执行时间片。那么,如何让主线程多次被挂起呢?很简单,只要让主线程连续执行完毕所需要的时间是系统时间片的N倍即可,具体N等于多少合适,那需要视其他线程完整执行需要多少时间。我们实验一下,把调用Sleep()那行代码注释起来,然后在那里写上如下代码:
  //Sleep(5);
  for(int i=0;i&1000000;i++){}
  这个for循环什么事也不做,就是延长主线程的执行时间,使主线程在一个时间片里执行不完,分成在若干个时间片里执行。运行程序,可以发现,输出的sum值等于6,符合预期,说明,线程1和线程2都得到了执行。
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&3175人阅读
创建线程好几个函数可以使用,可是它们有什么区别,适用于什么情况呢?
参考了一些资料,写得都挺好的,这里做一些摘抄和整合。
【参考1】=====================================================================
1、CreateThread——Windows的API函数
2、_beginthreadex——MS对C Runtime库的扩展SDK函数
3、AfxBeginThread——MFC中线程创建的MFC函数
CreateThread
(API函数:SDK函数的标准形式,直截了当的创建方式,任何场合都可以使用。)
提供操作系统级别的创建线程的操作,且仅限于工作者线程。不调用MFC和RTL的函数时,可以用CreateThread,其它情况不要轻易。在使用的过程中要考虑到进程的同步与互斥的关系(防止死锁)。
线程函数定义为:DWORD WINAPI _yourThreadFun(LPVOID pParameter)。
但它没有考虑:
(1)C Runtime中需要对多线程进行纪录和初始化,以保证C函数库工作正常(典型的例子是strtok函数)。
(2)MFC也需要知道新线程的创建,也需要做一些初始化工作(当然,如果没用MFC就没事了)。&&
_beginthreadex
MS对C Runtime库的扩展SDK函数,首先针对C Runtime库做了一些初始化的工作,以保证C Runtime库工作正常。然后,调用CreateThread真正创建线程。 仅使用Runtime Library时,可以用_BegingThread。
AfxBeginThread
MFC中线程创建的MFC函数,首先创建了相应的CWinThread对象,然后调用CWinThread::CreateThread,&& 在CWinThread::CreateThread中,完成了对线程对象的初始化工作,然后,调用_beginthreadex(AfxBeginThread相比较更为安全)创建线程。它简化了操作或让线程能够响应消息,即可用于界面线程,也可以用于工作者线程,但要注意不要在一个MFC程序中使用_beginthreadex()或CreateThread()。
线程函数定义为:UINT _yourThreadFun(LPVOID pParam)
=====================================================================
=====================================================================
CreateThread
“CreateThread函数是用来创建线程的Windows函数不过,如果你正在编写C/C++代码,决不应该调用CreateThread。相反,应该使用Visual C++运行期库函数_beginthreadex。如果不使用Microsoft的Visual C++编译器,你的编译器供应商有它自己的CreateThred替代函数。不管这个替代函数是什么,你都必须使用。”
_beginthreadex
&_beginthreadex函数的参数列表与CreateThread函数的参数列表是相同的,但是参数名和类型并不完全相同。这是因为 Microsoft的C/C++运行期库的开发小组认为, C/C++运行期函数不应该对Windows数据类型有任何依赖。_beginthreadex函数也像CreateThread那样,返回新创建的线程的句柄。因此,如果调用源代码中的CreateThread,就很容易用对_beginthreadex的调用全局取代所有这些调用。不过,由于数据类型并不完全相同,所以必须进行某种转换,使编译器运行得顺利些。&&
&下面是关于_beginthreadex的一些要点:&
1) 每个线程均获得由C/C++运行期库的堆栈分配的自己的tiddata内存结构。(tiddata结构位于Mtdll.h文件中的Visual C++源代码中)。&
2) 传递给_beginthreadex的线程函数的地址保存在tiddata内存块中。传递给该函数的参数也保存在该数据块中。&
3) _beginthreadex确实从内部调用CreateThread,因为这是操作系统了解如何创建新线程的唯一方法。&
4) 当调用CreatetThread时,它被告知通过调用_threadstartex而不是pfnStartAddr来启动执行新线程。还有,传递给线程函数的参数是tiddata结构而不是pvParam的地址。&
5) 如果一切顺利,就会像CreateThread那样返回线程句柄。如果任何操作失败了,便返回NULL。&
“也许你想知道,如果调用CreateThread,而不是调用C/C++运行期库的_beginthreadex来创建新线程,将会发生什么情况。当一个线程调用要求tiddata结构的C/C++运行期库函数时,将会发生下面的一些情况(大多数C/C++运行期库函数都是线程安全函数,不需要该结构)。
首先,C/C++运行期库函数试图(通过调用TlsGetValue)获取线程的数据块的地址。如果返回NULL作为tiddata块的地址,调用线程就不拥有与该地址相关的tiddata块。这时,C/C++运行期库函数就在现场为调用线程分配一个tiddata块,并对它进行初始化。然后该 tiddata块(通过TlsSetValue)与线程相关联。此时,只要线程在运行,该tiddata将与线程待在一起。这时,C/C++运行期库函数就可以使用线程的tiddata块,而且将来被调用的所有C/C++运行期函数也能使用tiddata块。&
当然,这看来有些奇怪,因为线程运行时几乎没有任何障碍。不过,实际上还是存在一些问题。首先,如果线程使用C/C++运行期库的signal函数,那么整个进程就会终止运行,因为结构化异常处理帧尚未准备好。第二,如果不是调用_endthreadex来终止线程的运行,那么数据块就不会被撤消,内存泄漏就会出现(那么谁还为使用CreateThread函数创建的线程来调用_endthreadex呢?)。&
注意如果程序模块链接到多线程DLL版本的C/C++运行期库,那么当线程终止运行并释放tiddata块(如果已经分配了tiddata块的话)时,该运行期库会收到一个DLL_THREAD_DETACH通知。尽管这可以防止tiddata块的泄漏,但是强烈建议使用_beginthreadex而不是使用Createthread来创建线程。
=====================================================================
=====================================================================
  在 Win32 API 中,创建线程的基本函数是 CreateThread,而 _beginthread(ex) 是C++ 运行库的函数。为什么要有两个呢?因为C++ 运行库里面有一些函数使用了全局量,如果使用 CreateThread 的情况下使用这些C++ 运行库的函数,就会出现不安全的问题。而 _beginthreadex 为这些全局变量做了处理,使得每个线程都有一份独立的“全局”量。
所以,如果你的编程只调用 Win32 API/SDK ,就放心用 CreateThread;如果要用到C++ 运行时间库,那么就要使用 _beginthreadex ,并且需要在编译环境中选择 Use MultiThread Lib/DLL。
通常他们的解释都是这容易造成内存泄漏。这个解释本身是没有错的,但是解释得不够完全和详细。以至于造成很多新手盲目的信任了那句话,在那里都是用_beginthreadex函数,或者是装作没有看到使用CreateThread函数。曾经有一段时间我也对这个问题很是困惑,不知道到底用那个才是对的。因为我不止一次在很多权威性的代码中看到对CreateThread函数的直接调用。难道是权威错了?? 抱着怀疑的态度查找了大量的资料和书籍,终于搞明白了这个问题的关键所在,在此做个说明,算是对那句话的一个完善。
关于_beginthreadex和CreateThread的区别我就不做说明了,这个很容易找到的。我们只要知道一个问题:_beginthreadex是一个C运行时库的函数,CreateThread是一个系统API函数,_beginthreadex内部调用了CreateThread。只所以所有的书都强调内存泄漏的问题是因为_beginthreadex函数在创建线程的时候分配了一个堆结构并和线程本身关联起来,我们把这个结构叫做tiddata结构,是通过线程本地存储器TLS于线程本身关联起来。我们传入的线程入口函数就保存在这个结构中。tiddata的作用除了保存线程函数入口地址之外,还有一个重要的作用就是:C运行时库中有些函数需要通过这个结构来保存和获取一些数据,比如说errno之类的线程全局变量。这点才是最重要的。
当一个线程调用一个要求tiddata结构的运行时库函数的时候,将发生下面的情况:
运行时库函数试图TlsGetv alue获取线程数据块的地址,如果没有获取到,函数就会现场分配一个 tiddata结构,并且和线程相关联,于是问题出现了,如果不通过_endthreadex函数来终结线程的话,这个结构将不会被撤销,内存泄漏就会出现了。但通常情况下,我们都不推荐使用_endthreadex函数来结束线程,因为里面包含了ExitThread调用。
找到了内存泄漏的具体原因,我们可以这样说:只要在创建的线程里面不使用一些要求tiddata结构的运行时库函数,我们的内存时安全的。所以,前面说的那句话应该这样说才完善:
“绝对不要调用系统自带的CreateThread函数创建新的线程,而应该使用_beginthreadex,除非你在线程中绝不使用需要tiddata结构的运行时库函数”
这个需要tiddata结构的函数有点麻烦了,在侯捷的《win32多线程程序设计》一书中这样说到:
如果在除主线程之外的任何线程中进行一下操作,你就应该使用多线程版本的C runtime library,并使用_beginthreadex和_endthreadex:
1 使用malloc()和free(),或是new和delete
2 使用stdio.h或io.h里面声明的任何函数
3 使用浮点变量或浮点运算函数
4 调用任何一个使用了静态缓冲区的runtime函数,比如:asctime(),strtok()或rand()
=====================================================================
【参考4】=====================================================================
1. Create/EndThread是Win32方法开始/结束一个线程
_beginthreadx/_endthreadex是C RunTime方式开始/结束一个线程
AfxBeginThread在MFC中开始/结束一个线程
2.直接在CreateThread API创建的线程中使用sprintf,malloc,strcat等涉及CRT存储堆操作的CRT库函数是很危险的,容易造成线程的意外中止。 在使用_beginthread和_beginthreadex创建的线程中可以安全的使用CRT函数。但是必须在线程结束的时候相应的调用_endthread或_endthreadex
3._beginthread成对调用的_endthread函数内部隐式的调用CloseHandle关闭了线程句柄,而与_beginthreadex成对使用的_endthreadex则没有关闭线程的句柄,需要显示的调用CloseHandle关闭线程句柄,不要使用_beginthread,使用._beginthreadex代替之。
4.尽量不要在一个MFC程序中使用_beginthreadex()或CreateThread()。
5.没有使用到MFC的线程尽量用_beginthreadex启动。
6.如果在一个与LIBCMT.LIB链接的程序中调用C Runtime函数,则必须要用_beginthreadex启动线程
7._beginthreadex启动的线程可以安全的调用任何C Runtime 函数
=====================================================================
=====================================================================
&&Windows核心编程&&中有很详细地介绍:
注意:若要创建一个新线程,绝对不要使用CreateThread,而应使用_beginthreadex.
Why?考虑标准C运行时库的一些变量和函数,如errno,这是一个全局变量。全局变量用于多线程会出什么事,你一定知道的了。故必须存在一种机制,使得每个线程能够引用它自己的errno变量,又不触及另一线程的errno变量._beginthreadex就为每个线程分配自己的tiddata内存结构。该结构保存了许多像errno这样的变量和函数的值、地址(自己看去吧)。
通过线程局部存储将tiddata与线程联系起来。具体实现在Threadex.c中有。&&&
结束线程使用函数_endthreadex函数,释放掉线程的tiddata数据块。&&&
CRT的函数库在线程出现之前就已经存在,所以原有的CRT不能真正支持线程,这导致我们在编程的时候有了CRT库的选择,在MSDN中查阅CRT的函数时都有:
Libraries&&&
LIBC.LIB&& Single&& thread&& static&& library,&& retail&& version&&&&&
LIBCMT.LIB&& Multithread&& static&& library,&& retail&& version&&&&&
MSVCRT.LIB&& Import&& library&& for&& MSVCRT.DLL,&& retail&& version&&&&&
这样的提示!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:135105次
积分:2310
积分:2310
排名:第13351名
原创:82篇
转载:19篇
评论:23条
(1)(1)(2)(1)(1)(1)(1)(2)(4)(1)(1)(6)(1)(2)(7)(4)(3)(3)(5)(8)(6)(8)(7)(1)(5)(6)(4)(3)(1)(3)(9)大神们,学哥学姐们,帮忙做下解决下问题吧_linux吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:163,319贴子:
大神们,学哥学姐们,帮忙做下解决下问题吧收藏
1. 操作系统通常应提供哪些服务? 2. 现代微内核主要功能是什么,如何控制核外系统模块?嵌入式实时操作系统的内核特性是什么? 3.shell作为命令解释系统的工作方式是什么?其初始化时主要使用哪些文件? 4. 请描述虚拟内存、虚拟设备、虚拟操作系统概念。5. 如何终止某一僵死进程?打印进程能否以同样方式终止? 6.
Linux如何进行进程调度?引入线程机制后,进程管理内容包括哪些? 7.请描述实现嵌入式开发的流程(包括交叉编译工具链创建概述)
1.给出如下变量声明:HOME=/home/rangeBINDIR=/home/range/bin问:以下if 语句含义是什么?if [$HOME/bin=$BINDIR] thenecho “Your binaries are stored in your home directory.”fi
2. 已知文件userlist为一用户列表。1)试编写一个shell脚本完成如下功能:若用户名username在该用户列表中,则为该用户主目录中考入信息文件information,并将此文件用户主设置为当前的username,然后显示用户名。2)若你是使用vi编辑的这个shell脚本,如何使其运行?3.下列C算法描述了线程函数的创建和调用,请参考注释内容给出程序运行结果。 #include &stdio.h&
#include &stdlib.h&
#include &pthread.h&
void *thrd_func1(void *arg);
void *thrd_func2(void *arg);int main() { pthread_t tid1,tid2;
void *// 创建线程tid1,线程函数thrd_func1
if(pthread_create(&tid1,NULL,thrd_func1,NULL)!=0)
printf(&Create thread 1error!\n&);
}// 创建线程tid2,线程函数thrd_func2
if (pthread_create(&tid2,NULL,thrd_func2,NULL)!=0)
{ printf(&Create thread 2error!\n&);
}// 等待线程tid1结束,线程函数返回值放在tret中
if (pthread_join(tid1,&tret)!=0)
{ printf(&Join thread 1error!\n&);
}printf(&Thread 1 exit code: %d.\n&,(int *)tret);// 等待tid2结束,线程函数返回值放在tret中
if (pthread_join(tid2,&tret)!=0)
{ printf(“Join thread 2error!\n”);
}printf(“Thread 2 exit code: %d.\n”,(int *)tret);return 0; }
//main结束 void *thrd_func1(void *arg)
{ printf(&Thread 1 returning!\n&);
// sleep(3);
return ((void *)1); // 自动退出线程 } void *thrd_func2(void *arg)
{ printf(&Thread 2 exiting!\n&);pthread_exit((void *)2);
// 线程主动退出,返回(void *)2 }本算法运行结果:
4.UNIX如何维护系统安全,主要目的及策略是什么?谈谈你对UNIX/Linux系统的理解与看法。(5分)
CGWANG原画培训 「零基础全额退费保障」,原画名企委托培训,高薪工作不是梦
好多问题啊。。你学的是Linux系统编程这本书吧
忘咧,这门课我们老师讲的时候压根就和课本一点关系都没有
自己勤快点,翻书吧
第三题代码错了printf(“Thread 2 exit code: %d.\n”,(int *)tret);应该是printf(“Thread 2 exit code: %d.\n”, (int) tret);而且, 为什么注释掉sleep?
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或君,已阅读到文档的结尾了呢~~
实验要求提交内容:源程序(必须有注释)、数据文件、运行结果、实验报告
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
实验要求提交内容:源程序(必须有注释)、数据文件、运行结果、实验报告
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口2013年7月 Linux/Unix社区大版内专家分月排行榜第二2012年6月 Linux/Unix社区大版内专家分月排行榜第二2011年5月 Linux/Unix社区大版内专家分月排行榜第二2011年4月 Linux/Unix社区大版内专家分月排行榜第二2011年3月 Linux/Unix社区大版内专家分月排行榜第二2010年10月 Linux/Unix社区大版内专家分月排行榜第二2010年9月 Linux/Unix社区大版内专家分月排行榜第二
2011年9月 Linux/Unix社区大版内专家分月排行榜第三2010年12月 Linux/Unix社区大版内专家分月排行榜第三2010年11月 Linux/Unix社区大版内专家分月排行榜第三2010年9月 C/C++大版内专家分月排行榜第三
2010年8月 Linux/Unix社区大版内专家分月排行榜第二2010年7月 Linux/Unix社区大版内专家分月排行榜第二
2010年9月 Linux/Unix社区大版内专家分月排行榜第三2003年7月 Linux/Unix社区大版内专家分月排行榜第三2002年3月 专题开发/技术/项目大版内专家分月排行榜第三2001年8月 专题开发/技术/项目大版内专家分月排行榜第三
2013年7月 Linux/Unix社区大版内专家分月排行榜第二2012年6月 Linux/Unix社区大版内专家分月排行榜第二2011年5月 Linux/Unix社区大版内专家分月排行榜第二2011年4月 Linux/Unix社区大版内专家分月排行榜第二2011年3月 Linux/Unix社区大版内专家分月排行榜第二2010年10月 Linux/Unix社区大版内专家分月排行榜第二2010年9月 Linux/Unix社区大版内专家分月排行榜第二
2011年9月 Linux/Unix社区大版内专家分月排行榜第三2010年12月 Linux/Unix社区大版内专家分月排行榜第三2010年11月 Linux/Unix社区大版内专家分月排行榜第三2010年9月 C/C++大版内专家分月排行榜第三
2010年8月 Linux/Unix社区大版内专家分月排行榜第二2010年7月 Linux/Unix社区大版内专家分月排行榜第二
2010年9月 Linux/Unix社区大版内专家分月排行榜第三2003年7月 Linux/Unix社区大版内专家分月排行榜第三2002年3月 专题开发/技术/项目大版内专家分月排行榜第三2001年8月 专题开发/技术/项目大版内专家分月排行榜第三
2010年8月 Linux/Unix社区大版内专家分月排行榜第二2010年7月 Linux/Unix社区大版内专家分月排行榜第二
2010年9月 Linux/Unix社区大版内专家分月排行榜第三2003年7月 Linux/Unix社区大版内专家分月排行榜第三2002年3月 专题开发/技术/项目大版内专家分月排行榜第三2001年8月 专题开发/技术/项目大版内专家分月排行榜第三
2010年8月 Linux/Unix社区大版内专家分月排行榜第二2010年7月 Linux/Unix社区大版内专家分月排行榜第二
2010年9月 Linux/Unix社区大版内专家分月排行榜第三2003年7月 Linux/Unix社区大版内专家分月排行榜第三2002年3月 专题开发/技术/项目大版内专家分月排行榜第三2001年8月 专题开发/技术/项目大版内专家分月排行榜第三
2008年11月 Linux/Unix社区大版内专家分月排行榜第三
2008年11月 Linux/Unix社区大版内专家分月排行榜第三
2010年8月 Linux/Unix社区大版内专家分月排行榜第二2010年7月 Linux/Unix社区大版内专家分月排行榜第二
2010年9月 Linux/Unix社区大版内专家分月排行榜第三2003年7月 Linux/Unix社区大版内专家分月排行榜第三2002年3月 专题开发/技术/项目大版内专家分月排行榜第三2001年8月 专题开发/技术/项目大版内专家分月排行榜第三
2010年8月 Linux/Unix社区大版内专家分月排行榜第二2010年7月 Linux/Unix社区大版内专家分月排行榜第二
2010年9月 Linux/Unix社区大版内专家分月排行榜第三2003年7月 Linux/Unix社区大版内专家分月排行榜第三2002年3月 专题开发/技术/项目大版内专家分月排行榜第三2001年8月 专题开发/技术/项目大版内专家分月排行榜第三
2010年8月 Linux/Unix社区大版内专家分月排行榜第二2010年7月 Linux/Unix社区大版内专家分月排行榜第二
2010年9月 Linux/Unix社区大版内专家分月排行榜第三2003年7月 Linux/Unix社区大版内专家分月排行榜第三2002年3月 专题开发/技术/项目大版内专家分月排行榜第三2001年8月 专题开发/技术/项目大版内专家分月排行榜第三
2013年7月 Linux/Unix社区大版内专家分月排行榜第二2012年6月 Linux/Unix社区大版内专家分月排行榜第二2011年5月 Linux/Unix社区大版内专家分月排行榜第二2011年4月 Linux/Unix社区大版内专家分月排行榜第二2011年3月 Linux/Unix社区大版内专家分月排行榜第二2010年10月 Linux/Unix社区大版内专家分月排行榜第二2010年9月 Linux/Unix社区大版内专家分月排行榜第二
2011年9月 Linux/Unix社区大版内专家分月排行榜第三2010年12月 Linux/Unix社区大版内专家分月排行榜第三2010年11月 Linux/Unix社区大版内专家分月排行榜第三2010年9月 C/C++大版内专家分月排行榜第三
2010年8月 Linux/Unix社区大版内专家分月排行榜第二2010年7月 Linux/Unix社区大版内专家分月排行榜第二
2010年9月 Linux/Unix社区大版内专家分月排行榜第三2003年7月 Linux/Unix社区大版内专家分月排行榜第三2002年3月 专题开发/技术/项目大版内专家分月排行榜第三2001年8月 专题开发/技术/项目大版内专家分月排行榜第三
2013年7月 Linux/Unix社区大版内专家分月排行榜第二2012年6月 Linux/Unix社区大版内专家分月排行榜第二2011年5月 Linux/Unix社区大版内专家分月排行榜第二2011年4月 Linux/Unix社区大版内专家分月排行榜第二2011年3月 Linux/Unix社区大版内专家分月排行榜第二2010年10月 Linux/Unix社区大版内专家分月排行榜第二2010年9月 Linux/Unix社区大版内专家分月排行榜第二
2011年9月 Linux/Unix社区大版内专家分月排行榜第三2010年12月 Linux/Unix社区大版内专家分月排行榜第三2010年11月 Linux/Unix社区大版内专家分月排行榜第三2010年9月 C/C++大版内专家分月排行榜第三
2010年8月 Linux/Unix社区大版内专家分月排行榜第二2010年7月 Linux/Unix社区大版内专家分月排行榜第二
2010年9月 Linux/Unix社区大版内专家分月排行榜第三2003年7月 Linux/Unix社区大版内专家分月排行榜第三2002年3月 专题开发/技术/项目大版内专家分月排行榜第三2001年8月 专题开发/技术/项目大版内专家分月排行榜第三
2010年8月 Linux/Unix社区大版内专家分月排行榜第二2010年7月 Linux/Unix社区大版内专家分月排行榜第二
2010年9月 Linux/Unix社区大版内专家分月排行榜第三2003年7月 Linux/Unix社区大版内专家分月排行榜第三2002年3月 专题开发/技术/项目大版内专家分月排行榜第三2001年8月 专题开发/技术/项目大版内专家分月排行榜第三
2010年8月 Linux/Unix社区大版内专家分月排行榜第二2010年7月 Linux/Unix社区大版内专家分月排行榜第二
2010年9月 Linux/Unix社区大版内专家分月排行榜第三2003年7月 Linux/Unix社区大版内专家分月排行榜第三2002年3月 专题开发/技术/项目大版内专家分月排行榜第三2001年8月 专题开发/技术/项目大版内专家分月排行榜第三
2010年8月 Linux/Unix社区大版内专家分月排行榜第二2010年7月 Linux/Unix社区大版内专家分月排行榜第二
2010年9月 Linux/Unix社区大版内专家分月排行榜第三2003年7月 Linux/Unix社区大版内专家分月排行榜第三2002年3月 专题开发/技术/项目大版内专家分月排行榜第三2001年8月 专题开发/技术/项目大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 注释和参考文献的区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信