linux多线程编程
2013-10-22 15:39
337 查看
二、什么时候使用多线程?
当多个任务可以并行执行时,可以为每个任务启动一个线程。
三、线程的创建
使用pthread_create函数。#include<pthread.h>
int pthread_create (pthread_t *__restrict __newthread,//新创建的线程ID
__const pthread_attr_t *__restrict __attr,//线程属性
void *(*__start_routine) (void *),//新创建的线程从start_routine开始执行
void *__restrict __arg)//执行函数的参数
返回值:成功-0,失败-返回错误编号,可以用strerror(errno)函数得到错误信息
四、线程的终止
三种方式线程从执行函数返回,返回值是线程的退出码
线程被同一进程的其他线程取消
调用pthread_exit()函数退出。这里不是调用exit,因为线程调用exit函数,会导致线程所在的进程退出。
一个小例子:
启动两个线程,一个线程对全局变量num执行加1操作,执行五百次,一个线程对全局变量执行减1操作,同样执行五百次。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
int num=0;
void *add(void *arg) {//线程执行函数,执行500次加法
int i = 0,tmp;
for (; i <500; i++)
{
tmp=num+1;
num=tmp;
printf("add+1,result is:%d\n",num);
}
return ((void *)0);
}
void *sub(void *arg)//线程执行函数,执行500次减法
{
int i=0,tmp;
for(;i<500;i++)
{
tmp=num-1;
num=tmp;
printf("sub-1,result is:%d\n",num);
}
return ((void *)0);
}
int main(int argc, char** argv) {
pthread_t tid1,tid2;
int err;
void *tret;
err=pthread_create(&tid1,NULL,add,NULL);//创建线程
if(err!=0)
{
printf("pthread_create error:%s\n",strerror(err));
exit(-1);
}
err=pthread_create(&tid2,NULL,sub,NULL);
if(err!=0)
{
printf("pthread_create error:%s\n",strerror(err));
exit(-1);
}
err=pthread_join(tid1,&tret);//阻塞等待线程id为tid1的线程,直到该线程退出
if(err!=0)
{
printf("can not join with thread1:%s\n",strerror(err));
exit(-1);
}
printf("thread 1 exit code %d\n",(int)tret);
err=pthread_join(tid2,&tret);
if(err!=0)
{
printf("can not join with thread1:%s\n",strerror(err));
exit(-1);
}
printf("thread 2 exit code %d\n",(int)tret);
return 0;
}
使用g++编译该文件(g++ main.cpp -o main)。此时会报错undefined reference to `pthread_create'。
报这个错误的原因是:pthread库不是linux默认的库,所以在编译时候需要指明libpthread.a库。
解决方法:在编译时,加上-lpthread参数。
执行结果:
乍一看,结果是对的,加500次,减500次,最后结果为0。但是仔细看所有的输出,你会发现有异样的东西。
相关文章推荐
- putty之类的工具登录Linux主机慢
- 使用 udev 高效、动态地管理 Linux 设备文件(转载)--3
- 使用 udev 高效、动态地管理 Linux 设备文件(转载)--2
- Linux挂载U盘:mount: unknown filesystem type 'ntfs'
- 使用 udev 高效、动态地管理 Linux 设备文件(转载)--1
- 添加Udev规则,让Linux自动挂载U盘(转载)
- linux 自动挂载U盘(1)
- linux-gcc 编译时头文件和库文件搜索路径-转载
- 转:uImage,zimage,bzimage,vmlinux,vmlinuz
- linux软件汉化的一些标准(转自-Ubuntu 简体中文小组工作指南)
- linux虚拟机clone之后,eth0处理问题
- 转贴:浅析 Linux 的国际化与本地化机制
- 转贴:linux软件国际化
- 在Linux下开发多语言软件: Hello GetText!(转载)
- CentOS忘记密码
- linux配置路由
- linux中装置档案管理
- linux sqlplus查询数据中文乱码解决方法记录
- 快速设置linux主机与PC之间共享目录--sudo mount -t cifs //192.168.0.41/share_ share_pc/ -o user=lms
- linux内核奇遇记之md源代码解读之十一raid5d