登陆论坛
|
论坛注册
|
加入收藏
|
设为首页
|
RSS
首页
Linux频道
软件下载
开发语言
技术论坛
嵌入式频道
|
数据库开发
|
WEB开发
|
软件开发
|
嵌入应用
|
内核研究
|
SHELL
|
输入您的搜索字词
提交搜索表单
您当前的位置:
首页
>
Linux频道
>
Linux开发区
>
软件开发
Linux pthread 编程
时间:2007-11-07 16:44:41 来源:
Linux联盟收集整理
作者:
Linux下线程级编程并不是很复杂,但是不容易使用。最主要的原因是编程人员对于Linux系统自身的线程机制理解的不是很深刻,在这种情况下去使用线程那么许多“看不到”的事情就会降临,自然线程的编写者是看不到这些的。所以线程看起来比较简单,实则,是需要经过精心修炼才能运用自如的。下面是我个人在学习线程编程过程中积累的一点经验,记录如下:
gYDLinux联盟
gYDLinux联盟
什么是线程?
gYDLinux联盟
Window下线程的概念应该已经很成熟,那么Linux的线程是不是跟windows一样呢?我们不必深究其中的细节,它们的共同目标就是让一个进程能够更快的执行自己的代码,更高效的工作。这就是说如果有一个任务,你不想用多进程实现,但又希望它工作的很快,你可以选择多线程。至于多线程跟多进程,那个更,在此我不讲述,有兴趣的自己学习相关的资料吧。
gYDLinux联盟
gYDLinux联盟
线程的创建方法
gYDLinux联盟
gYDLinux联盟
我们知道进程的创建需要fork来完成。那么,线程也差不多需要调用系统调用来产生新的线程。linux下就是pthread_create()这个API,只要将必要的参数初始化就可以产生一个新的线程执行自己的代码。
gYDLinux联盟
gYDLinux联盟
首先,介绍一下线程所需要的头文件pthread.h。包含了这个头文件以后,我们就可以使用线程相关的API以及数据结构了(注意:包含头文件的同时,编译的时候要加上-lpthread告诉编译器线lib的位置)。
gYDLinux联盟
gYDLinux联盟
下面,介绍线程相关的数据结构和API:
gYDLinux联盟
pthread_t是一个表示线程类型的数据结构,只要有一个线程就存在一个这样的标识符。它是在创建线程的时候必须指定的,跟进程标识符很相似。
gYDLinux联盟
gYDLinux联盟
pthread_create()这个API是创建线程的一个API,所有关于新线程的设置都要在这里指定。因此,它的参数比较复杂,我们一个一个看。
gYDLinux联盟
gYDLinux联盟
练习的code:
gYDLinux联盟
gYDLinux联盟
int thx = 10;
gYDLinux联盟
int thy = 100;
gYDLinux联盟
sem_t sem;
gYDLinux联盟
gYDLinux联盟
void* thread_print(void* parameter){
gYDLinux联盟
unsigned int i = *((unsigned int*)parameter);
gYDLinux联盟
while(i--){
gYDLinux联盟
sem_wait(&sem);
gYDLinux联盟
fprintf(stderr, "in thread_print!\n");
gYDLinux联盟
}
gYDLinux联盟
return (void*)(thx);
gYDLinux联盟
}
gYDLinux联盟
void* thread_print0(void* parameter){
gYDLinux联盟
unsigned int i = *((unsigned int*)parameter);
gYDLinux联盟
while(i--){
gYDLinux联盟
sem_wait(&sem);
gYDLinux联盟
fprintf(stderr, "in thread_print 00000!\n");
gYDLinux联盟
}
gYDLinux联盟
return (void*)(thy);
gYDLinux联盟
}
gYDLinux联盟
gYDLinux联盟
cout<<"Pthread programming test!"<<endl;
gYDLinux联盟
pthread_t thread_id;
gYDLinux联盟
pthread_t thread_id0;
gYDLinux联盟
sem_init(&sem, 0 , 200);
gYDLinux联盟
int thread_data = 100;
gYDLinux联盟
int thread_data0 = 100;
gYDLinux联盟
int res, res0;
gYDLinux联盟
int* pres = & res;
gYDLinux联盟
int* pres0 = & res0;
gYDLinux联盟
pthread_create(&thread_id, NULL, &thread_print, &thread_data);
gYDLinux联盟
pthread_create(&thread_id0, NULL, &thread_print0, &thread_data0);
gYDLinux联盟
pthread_join(thread_id, (void**)(&(res)));
gYDLinux联盟
pthread_join(thread_id0, (void**)&(res0));
gYDLinux联盟
cout<<"thread res is "<<res<<"thread0 res 0 is "<<res0<<endl;
gYDLinux联盟
来顶一下
返回首页
发表评论
共有
条评论
用户名:
密码:
验证码:
匿名发表
相关文章
无相关信息
栏目更新
栏目热门
站内搜索:
Linux频道
下载频道
图库
商品
嵌入式频道
高级搜索
网站首页
|
关于我们
|
服务条款
|
广告服务
|
联系我们
|
网站大全
|
免责声明
|
返回顶部
Copyright © 2007-2008 xxlinux.com, All rights reserved.
Powered by linux联盟
京ICP备05012402号