Linux C/C++多线程pthread实例

inux中C/C++开发多线程程序多遵循POSIX线程接口(也就是pthread),pthread涉及函数很多个(更多参见pthread.h头文件),常用的有pthread_create、pthread_dispath、pthread_mutex_lock(互斥锁定)、pthread_mutex_unlock(互斥解锁)等。入门而言,先把线程创建出来,然后编译通过之后再慢慢完善,具体步骤如下。

Linux首先需要安装GCC/G++编译环境,方法本文从略,然后建个test.c或test.cpp文件。

本文测试系统Ubuntu 11.10。GCC编译器截至发文日期止最新的版本,现在不在办公室下次补上。

1、pthread_create函数定义

int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void), void *restrict arg);

参数1:指向线程标识符指针。
参数2:线程属性。
参数3:线程运行函数起始地址。
参数4:运行函数的参数。

创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。

2、源码包含pthread头文件

include <pthread.h>

3、创建多线程示例程序C格式

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>pthread_t ntid;void *fnThreadFun(void *para){//...
return ((void *)0);
}int main(){int err;err = pthread_create(&ntid,NULL,fnThreadFun,NULL);
if(err != 0){
printf("can't create thread: %s\n",strerror(err));
return 1;
}
sleep(1);
return 0;
}

4、创建多线程示例程序C++格式

ctest.h

#include <pthread.h>class ctest{public:ctest();~ctest();private:void createthread();};

ctest.cpp

ctest::ctest(){}
ctest::~ctest(){}
void* fnThreadFun(void *para){
//...
return ((void *)0);
}void ctest::createthread()
{
pthread_t ntid;
err = pthread_create(&ntid,NULL,fnThreadFun,NULL);
if(err != 0){
printf("can't create thread: %s\n",strerror(err));
return 1;
}
} 

test.cpp

#include ctest.hint main(){ctest tst;tst.createthread();while(1){//...sleep(1);}
return 0;}

另外,也可以把线程函数设计到类中,但是必须声明为static类型,天缘认为完全没这个必要,因为static类型函数在编译时仍然是先分配全局地址,反倒直接用全局似乎看起来更规整,就是注意点,把函数名取好就可以了。

4、编译执行多线程程序

编译上述多线程程序,必须使用 -lpthread编译选项,因为pthread库不是Linux默认链接库,链接时必须指定使用libpthread.a库(天缘机子ubuntu11.10这些库在/usr/lib/i386-linux-gnu路径下),在编译选项中需添加-lpthread参数,示例如:

C编译选项:

>gcc test.c -o test -lpthread

C++编译选项:

>g++ ctest.cpp test.cpp -o test -lpthread

如果是写到MAKEFILE中,可以找到类似TARG_OPTIONS=这样的位置添加-lpthread。

但是往往还是会报告pthread_create未声明问题,说明编译器仍未找到libpthead.a的位置,这时可手动在编译命令行中添加:-L./usr/lib/i386-linux-gnu 选项(这里的路径是libthread.a路径,不同系统、机子可能有所不同!!)。

执行:

>./test

5、pthread注意事项

注意,pthread_create第三个参数,也就是线程回调函数格式为:

void* fnThreadFun(void* param)

{

  return NULL;//或return ((void *)0);

}

其返回值为void*型指针,如果写成void fnThreadFun(void* param)形式,那么编译会报告:

error: invalid conversion from ‘void (*)(void*)’ to ‘void* (*)(void*)’ [-fpermissive]

错误。

写成:

err = pthread_create(&ntid,NULL,(void*)&fnThreadFun,NULL);

样式似乎也不行,gcc编译时不会出错,但是用g++就会有问题(也会报告上面错误。),究其原因就是C语言编译器允许隐含性的将一个通用指针转换为任意类型的指针,而C++不允许(http://www.4ucode.com/Study/Topic/1353180)。

参考地址:

http://zhuwenlong.blog.51cto.com/209020/40339

线程互斥和解锁请参考:

http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/index.html

http://hi.baidu.com/see_yee/blog/item/139fe0243198ad34c8955917.html

http://en.wikipedia.org/wiki/POSIX_Threads

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 横向合并_使用Python横向合并excel文件的实例

起因&#xff1a;有一批数据需要每个月进行分析&#xff0c;数据存储在excel中&#xff0c;行标题一致&#xff0c;需要横向合并进行分析。数据示意&#xff1a;具有多个代码&#xff1a;# -*- coding: utf-8 -*-"""Created on Sun Nov 12 11:19:03 2017author:…

javafx游戏_JavaFX游戏(四连环)

javafx游戏这是我的第一个JavaFX游戏教程&#xff0c;也是我关于JavaFX面板的第一篇博客文章。 我仅用200几行代码就完成了这四款连接游戏&#xff0c;足以应付一个简单的游戏。 我在这里使用GridPane面板对磁盘进行布局&#xff0c;GridPane是JavaFX布局窗格之一&#xff0c;但…

Matlab的sort函数

1、Matlab自带排序函数sort用法 [Y,I] sort(X,DIM,MODE) sort函数默认Mode为ascend为升序&#xff0c;sort(X,descend)为降序排列。 sort(X)若X是矩阵&#xff0c;默认对X的各列进行升序排列 sort(X,dim) dim1时等效sort(X)dim2时表示对X中的各行元素升序…

django HttpResponse的用法

一、传json字典 def back_json(rquest):#JsonResponse父类是HttpResponse&#xff0c;原码里调用了json.dumps()from django.http import JsonResponseback_msg {name:name,age:123}return JsonResponse(back_msg) 二、传列表 def back_json(rquest):#JsonResponse父类是HttpR…

gcc/g++ 链接库的编译与链接

程序编译一般需要经预处理、编译、汇编和链接几个步骤。在实际应用中&#xff0c;有些公共代码需要反复使用&#xff0c;就把这些代码编译成为“库”文件。在链接步骤中&#xff0c;连接器将从库文件取得所需的代码&#xff0c;复制到生成的可执行文件中&#xff0c;这种库称为…

Speedment 3.0的新功能

如果您关注我的博客&#xff0c;那么您会知道我已经参与开源项目Speedment已有一段时间了。 在夏季和秋季&#xff0c;我完成了工具包的下一个3.0.0大型发行版的大量工作。 在这篇文章中&#xff0c;我将展示我们已经在平台中内置的一些很酷的新功能&#xff0c;并说明如何入门…

Matlab在坐标点上按顺序标序号

程序一&#xff1a; clear x[1 3 7 10]; y[2 4 9 43]; plot(x,y,r-) hold on for i1:4%用这个循环cnum2str(i);c[ ,c];text(x(i),y(i),c) end axis([0 10 0 50]) 程序二&#xff1a; xrand(10,1)*10; yrand(10,1)*10; %x,y表示任意10个点的坐标 plot(x,y,*); for i1:10text(x(…

python表情符号编码大全_Emoji的编码以及常见问题处理

我在虎嗅上看过一篇关于Emoji的趣闻, 特别有意思, 在这里跟大家分享一下。里面提到了Emoji是怎么诞生的。1999年前后&#xff0c;日本一个名叫栗田穰崇的年轻人&#xff0c;和许多直男一样&#xff0c; 给女友发的短信经常会被误解。比如&#xff0c;“知道了”被解读成“生气了…

机器学习套路三步走

机器学习的套路 1.model如何对现实的场景进行抽象2.model如何对参数进行求解3.model的效果如何评价1.抽象 例如线性回归&#xff0c;就是认为预测变量y和特征X之间存在线性关心&#xff0c;老掉牙的例子就是房价和地区收入&#xff0c;人口密度等等的线性关系 线性回归的数学假…

C及opencv指针释放问题

一个图像处理的项目运行时没有问题&#xff0c;最后关掉显示的图片时提醒触发一个断点&#xff0c;点击继续则出现以下画面&#xff1a;断点停留在释放指针的那一行。究其原因如下&#xff1a; 1.错用free释放IplImage* IplImage* input cvLoadImage("data/LOGO/2_1.jpg&…

gcc/g++基本命令简介

gcc & g现在是gnu中最主要和最流行的c & c编译器 。 g是c的命令&#xff0c;以.cpp为主&#xff0c;对于c语言后缀名一般为.c。这时候命令换做gcc即可。其实是无关紧要的。 其实编译器是根据gcc还是g来确定是按照C标准还是C标准编译链接。 下面以Test.cpp为例&#x…

python返回长度值_Python 文件 truncate() 方法(截断返回截取长度)

概述Python 文件 truncate() 方法用于截断文件并返回截断的字节长度。指定长度的话&#xff0c;就从文件的开头开始截断指定长度&#xff0c;其余内容删除&#xff1b;不指定长度的话&#xff0c;就从文件开头开始截断到当前位置&#xff0c;其余内容删除。语法truncate() 方法…

Opencv中IplImage的四字节对齐问题

一、结构解释IplImage数据结构体中有两个宽度&#xff1a;1 是width属性&#xff0c;表示图像的每行像素数&#xff1b;2 是widthStep属性&#xff0c;表示存储一行像素需要的字节数。在OpenCV里边&#xff0c;widthStep必须是4的倍数&#xff0c;从而实现字节对齐&#xff0c;…

庞佐错觉_水晶球错觉

庞佐错觉我注意到人们有时会避免进行彻底的测试。 对于某些人来说&#xff0c;这听起来像是伪造的&#xff0c;但请听我说…… 测试会产生被困的感觉&#xff0c;每引入一个新的测试&#xff0c;负担就会加重。 建立稳定&#xff0c;无干扰且质量保证的测试套件是一项艰巨的任务…

静态编译和动态编译区别

静态函数库 一般扩展名为&#xff08;.a&#xff09;,这类的函数库通常扩展名为libxxx.a 。 这类函数库在编译的时候会直接整合到程序中&#xff0c;所以利用静态函数库编译成的文件会比较大&#xff0c;这类函数库最大的优点就是编译成功的可执行文件可以独立运行&#xff0c;…

python怎么爬取电影海报_python爬虫之通过BeautifulSoup获取豆瓣最新上映电影的海报...

0.目录1.分析页面2.初步代码3.完整代码4.总结5.补充1.分析页面上一次我们讲了xpath获取豆瓣最新上映电影的海报&#xff0c;这一次会分析如何使用BeautifulSoup获取。启程&#xff1a;python爬虫之通过xpath获取豆瓣最新上映电影的海报​zhuanlan.zhihu.com首先&#xff0c;进入…

switch使用中遇到的问题

switch分支语句中case判断不会进行隐式数据类型转换&#xff1b; 1 const fn (value) > {2 let str all;3 switch (value) {4 case :5 return all0;6 case 3:7 return all3;8 case 4:9 return all4;…

opencv读取视频并保存为图片

1.功能&#xff1a;opencv读取指定文件夹中的视频文件&#xff0c;按照一定的间隔截取某些帧&#xff0c;将这些帧图像连续命名&#xff0c;存储在指定文件夹里。 2.代码如下&#xff1a; &#xff08;1&#xff09;IplImage #include <stdlib.h> #include <stdio.h&g…

将Jython嵌入到您的Java代码库中

Jython是一个使用相当可靠的语法的快速Java脚本的好工具。 实际上&#xff0c;当使用jmx为您的Java应用程序实现一些维护或监视脚本时&#xff0c;它的运行效果非常好。 如果您与其他具有python背景的团队合作&#xff0c;则将python集成到您的java应用程序是绝对有意义的。 …

C语言的编译链接过程详解

学过C语言的人都应该知道&#xff0c;我们所编辑的C语言程序是不能直接放到机器上运行的&#xff0c;它只不过是一个带".c"后缀的文件&#xff08;也称为源代码&#xff09;而已&#xff0c;需要经过一定的处理才能转换成机器上可运行的可执行文件。我们将对C语言的这…