时间:2021-05-20
运行之前需要做一些配置:
1.下载PTHREAD的WINDOWS开发包 pthreads-w32-2-4-0-release.exe(任何一个版本均可)
http://sourceware.org/pthreads-win32/ ,解压到一个目录。
2.找到include和lib文件夹,下面分别把它们添加到VC++6.0的头文件路径和静态链接库路径下面:
a).Tools->Options,选择Directory页面,然后在Show directories for:中选择Include files(默认) 在Directories中添加include的路径。在Show directories for:中选择Library files,
在Directories中添加lib的路径。
b).Project->Settings,选择Link页面,然后将lib下的*.lib文件添加到Object/library Modules,
各lib文件以空格隔开。
c).将lib下的*.dll文件复制到工程目录下,即根目录。
我们进行多线程编程,可以有多种选择,可以使用WindowsAPI,如果你在使用GTK,也可以使用GTK实现了的线程库,如果你想让你的程序有更多的移植性你最好是选择POSIX中的Pthread函数库,我的程序是在Linux下写的,所以我使用了Pthread库(是不是很伤心,我知道有不少人期待的是WindowsAPI的,好吧,有机会以后再讲那个,现在先把这一系列专题写完 ^_^)
如果你用的是LINUX/UNIX/MacOSX,那么我们已经可以开始了,如果你用的是WINDOWS,那么你需要从网站上下载PTHREAD的WINDOWS开发包,所幸他非常的小。网站地址是http://sourceware.org/pthreads-win32/
示例
先来看一个基本的例子:
在上面的例子中,我们首先加入了pthread.h文件包含,这是所以pthread多线程程序所必须的,接着是iostream我们进行输入输出时要用到,接着就是两个函数的定义,这和普通的函数没有什么区别,之所以写成的
void* tprocess1(void* args)这样的形式,完全是为了迎合pthread_create函数的参数类型,你也可以不这样定义,只要在调用pthread_create创建线程的时候强制转换一下指针类型就可以了。
这两个函数将被用做线程的执行体,也就是说在两个线程里同时运行这两个函数。
现在我们来看main函数,和pthread有关的调用都在这里了。
pthread_t是线程结构,用来保存线程相关数据,你也可以理解为是线程类型,声明一个线程对象(变量)。
这里我们声明了两个线程变量t1,t2
pthread_create(&t1,NULL,tprocess1,NULL); pthread_create(&t2,NULL,tprocess2,NULL);这两句非常重要,pthread_create用来创建线程并启动,他的原型是
我们可以知道第一个参数是线程指针,第二参数是线程属性指针,线程属性pthread_attr_t用来指定线程优先级等属性,一般的情况下,我们没有必要修改,使用默认属性来构造线程,所以这里一般取NULL,我们也是这样做的,第三个参数是一个函数指针(函数指针?什么东西,没听说过啊?……巨晕,好嘛,你复习一下C或是C++指针那部分吧)就是线程要执行的代码,这里我们分别要执行tprocess1 tprocess2就写成了上面的样子,这里这个函数指针的类型定义是返回一个空类型指针,接收一个空类型指针参数的函数指针,如果你的函数不是这个定义,那就可以直接转化一下就可以了。
写完这两行代码,两个线程就已经执行起来了,但是如果你省略了
然后尝试编译运行程序的时候你会发现程序似乎什么也没干就退出了,是的,那是因为程序的主线程退出的时候操作系统会关闭应用程序使用的所有资源,包括线程……所以在main函数结束前我们得想办法让程序停下来,pthread_join方法的功能就是等待线程结束,要等的线程就是第一个参数,程序会在这个地方停下来,直到线程结束,第二个参数用来接受线程函数的返回值,是void**类型的指针,如果没有返回值,就直接设为NULL吧。
程序写好了,我们怎么编译运行它呢?
如果你使用的是Linux:
在终端里输入
就可以完成程序的编译及运行
如果你用的是VC:
在工程属性里加入开发包里的几个库文件
把那几个DLL文件放到你的工程路径里,也就是程序运行时候的工作路径,这个在VC6和2005里似乎不太一样,如果你不确定,那就直接放到SYSTEM32里吧。。。
下面的工作就非常简单了
点运行,提示编译,就确定,好了,结果出来了。。。
是不是感觉多线程如此的简单,短短几行代码就搞定了,我想你已经可以写出一个简单的多线程程序了吧,呵呵,其实问题没有这么简单,多线程我们还要面对线程同步的问题,我会在下一个专题里给大家讲到。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
OpenMP是一种多处理器多线程的编程语言,能够支持多个平台,包括Linux系统,那么Linux下要如何进行openmp多线程编程呢?一起来了解下吧。 关
在C++11以前,C++的多线程编程均需依赖系统或第三方接口实现,一定程度上影响了代码的移植性。C++11中,引入了boost库中的多线程部分内容,形成C++标
这篇文章将向大家展示Java编程利用socket多线程访问服务器文件代码示例,如果您想先了解Java多线程socket编程的基础知识,可以看下这篇文章:Java
linux下的C\C++多进程多线程编程实例详解1、多进程编程#include#include#includeintmain(){pid_tchild_pid;
并发编程与多线程编程要了解并发编程,首先要懂得与并行这个概念进行区分。并行是指两个事件同时进行,并发是CPU切换速度快,看起来像是每个任务同时进行一样。多线程是