当前位置:  编程技术>其它
本页文章导读:
    ▪Linux下的C语言多线程编程      http://www.pcdog.com/edu/linux/13/11/y237287.html引言     线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也.........
    ▪Leica Cyclone 8.0.0.3382 Win32 1CD(徕卡三维激光扫描)      Leica Cyclone 8.0.0.3382 Win32 1CD(徕卡三维激光扫描) Leica.Cyclone.v7.4.1 & Plugins.Win64 1DVD Leica CloudWorx and ForensicMAP plugins collection 1CD Leica.Cyclone.II.Topo.v2.0.188.Win32 1CD Leica GeoMoS v3.0 1CD(监测系统软件) Lei.........
    ▪Paradigm Epos v4.0 Win32 1CD      Paradigm Epos v4.0 Win32 1CD Paradigm Epos v4.0 Linux64 1CD Paradigm Geolog v7.0 Win64 1CD Paradigm Geolog v6.7.1 1CD Paradigm Interpret 2008 1CD Paradigm Sysdrill v2009 1CD(钻井设计软件) ##########################################################.........

[1]Linux下的C语言多线程编程
    来源:    发布时间: 2013-11-15
http://www.pcdog.com/edu/linux/13/11/y237287.html
引言

    线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。现在,多

    为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题。

    使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。

    使用多线程的理由之二是线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。

    除了以上所说的优点外,不和进程比较,多线程程序作为一种多任务、并发的工作方式,当然有以下的优点:

    1) 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。
    2) 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
    3) 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

    下面我们先来尝试编写一个简单的多线程程序。

简单的多线程编程

    Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。顺便说一下,Linux下pthread的实现是通过系统调用clone()来实现的。clone()是Linux所特有的系统调用,它的使用方式类似fork,关于clone()的详细情况,有兴趣的读者可以去查看有关文档说明。下面我们展示一个最简单的多线程程序example1.c。

 

/* example.c*/ #include <stdio.h> #include <pthread.h> void thread(void) { int i; for(i=0;i<3;i++) printf("This is a pthread.\n"); } int main(void) { pthread_t id; int i,ret; ret=pthread_create(&id,NULL,(void *) thread,NULL); if(ret!=0){ printf ("Create pthread error!\n"); exit (1); } for(i=0;i<3;i++) printf("This is the main process.\n"); pthread_join(id,NULL); return (0); }

 

    我们编译此程序:
    gcc example1.c -lpthread -o example1
    运行example1,我们得到如下结果:
    This is the main process.
    This is a pthread.
    This is the main process.
    This is the main process.
    This is a pthread.
    This is a pthread.
    再次运行,我们可能得到如下结果:
    This is a pthread.
    This is the main process.
    This is a pthread.
    This is the main process.
    This is a pthread.
    This is the main process.

    前后两次结果不一样,这是两个线程争夺CPU资源的结果。上面的示例中,我们使用到了两个函数,  pthread_create和pthread_join,并声明了一个pthread_t型的变量。
    pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义:
    typedef unsigned long int pthread_t;
    它是一个线程的标识符。函数pthread_create用来创建一个线程,它的原型为:
    extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr,
    void *(*__start_routine) (void *), void *__arg));
    第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的函数thread不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。对线程属性的设定和修改我们将在下一节阐述。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。

    函数pthread_join用来等待一个线程的结束。函数原型为:
    extern int pthread_join __P ((pthread_t __th, void **__thread_return));

    第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现。它的函数原型为:
  extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));

    唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给thread_return。最后要说明的是,一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线程则返回错误代码ESRCH。

    在这一节里,我们编写了一个最简单的线程,并掌握了最常用的三个函数pthread_create,pthread_join和pthread_exit。下面,我们来了解线程的一些常用属性以及如何设置这些属性。

 

修改线程的属性

    在上一节的例子里,我们用pthread_create函数创建了一个线程,在这个线程中,我们使用了默认参数,即将该函数的第二个参数设为NULL。的确,对大多数程序来说,使用默认属性就够了,但我们还是有必要来了解一下线程的有关属性。

    属性结构为pthread_attr_t,它同样在头文件/usr/include/pthread.h中定义,喜欢追根问底的人可以自己去查看。属性值不能直接设置,须使用相关函数进行操作,初始化的函数为pthread_attr_init,这个函数必须在pthread_create函数之前调用。属性对象主要包括是否绑定、是否分离、堆栈地址、堆栈大小、优先级。默认的属性为非绑定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。

    关于线程的绑定,牵涉到另外一个概念:轻进程(LWP:Light Weight Process)。轻进程可以理解为内核线程,它位于用户层和系统层之间。系统对线程资源的分配、对线程的控制是通过轻进程来实现的,一个轻进程可以控制一个或多个线程。默认状况下,启动多少轻进程、哪些轻进程来控制哪些线程是由系统来控制的,这种状况即称为非绑定的

    
[2]Leica Cyclone 8.0.0.3382 Win32 1CD(徕卡三维激光扫描)
    来源:    发布时间: 2013-11-15

Leica Cyclone 8.0.0.3382 Win32 1CD(徕卡三维激光扫描)

Leica.Cyclone.v7.4.1 & Plugins.Win64 1DVD

Leica CloudWorx and ForensicMAP plugins collection 1CD

Leica.Cyclone.II.Topo.v2.0.188.Win32 1CD

Leica GeoMoS v3.0 1CD(监测系统软件)

Leica LisCAD v10.0 1CD(土地测量和工程学软件)

Leica.PhotoGrammetry.Suite.v9.1-ISO 1CD(数字摄影测量及遥感处理)

LEICA Geo Office v6.0 CHS-ISO 1CD(中文版,包括L1、L2 & GLONASS)

LEICA Geo Office v8.3-ISO 1CD(English version)

ERDAS Imagine v2011-ISO 1DVD(美国Leica公司开发的遥感图像处理系统)

ERDAS.Imagine.v8.7.With.LPS.V8.7-ISO 6CD(空间影像处理软件)

ERDAS.Stereo.Analyst.v1.0(立体分析模块)

 

#################################################################
#################################################################
专业提供各类行业软件,诚信为本,欢迎您的咨询

联系QQ:1140988741   电话:18980583122

MSN:  buysoftware@qq.com

联系Email: buysoftware2008@sohu.com   buysoftware@qq.com

点击咨询:http://haocax.53kf.com

#################################################################
#################################################################

 

Pixoneer Geomatics Inc产品:

PG-STEAMER.RTP.v4.1 1CD(遥测影像软体)

 

RSI产品:

Research.Systems.IDL v6.0 1CD

Research.Systems.Envi v4.2 1CD(一套功能齐全的遥感图像处理系统,是处理、分析并显示

                               多光谱数据、高光谱数据和雷达数据的高级工具)

Research.Systems.Envi 用户指南(中文)

 

S&T Virtual Reality Systems产品:

Blueberry.3D.Terrain.Tools.V1.0-ISO 2CD(三维地形编辑器)

 

Nelava产品:

Socet SET v5.3-ISO 1CD(数字摄影测量软件,主要提供於军事用途和商务方面,

                       藉由它可轻易得到地球上任一地方精确的座标位置)

Blue Marble Geographics产品:

BlueMarble Geographic Calculator v6.3 1CD(可以从任何实际的系统,数据,map工程中转换成直角坐标系)

BlueMarble Geographic Transformer v5.2 1CD(将图形中的象素和现实世界具体位置的坐标对应映射联系起来)

BlueMarble.Geographic.Tracker.v3.3 1CD(将图形中的象素和现实世界具体位置的坐标对应映射联系起来)

BlueMarble.Geographic.Transformer.Plugin.For.MapInfo.v1.0 1CD(为MapInfo开发的插件)

 

BOEING产品:

GIS.Feature.Collection.Module.v1.2.for.Boeing.SoftPlotter.v4.1-ISO 1CD( 数字摄影测量实用系统模块)

SoftPlotter.v4.1.with.Airfiled-ISO 1CD(数字摄影测量实用系统)



buysoftware 2013-01-07 14:25 发表评论

    
[3]Paradigm Epos v4.0 Win32 1CD
    来源:    发布时间: 2013-11-15

Paradigm Epos v4.0 Win32 1CD

Paradigm Epos v4.0 Linux64 1CD

Paradigm Geolog v7.0 Win64 1CD

Paradigm Geolog v6.7.1 1CD

Paradigm Interpret 2008 1CD

Paradigm Sysdrill v2009 1CD(钻井设计软件)

#################################################################
#################################################################
专业提供各类行业软件,诚信为本,欢迎您的咨询

联系QQ:1140988741   电话:18980583122

MSN:  buysoftware@qq.com

联系Email: buysoftware2008@sohu.com   buysoftware@qq.com

点击咨询:http://haocax.53kf.com

#################################################################
#################################################################

 

GoCAD v2009.3 p1 Win32 1CD(三维地质建模软件系统)

GoCAD v2.0.8 Linux 1CD

SKUA v2009.3 p1 Win32 1CD  

Wellead v4.0 1CD(钻井设计软件)

GoCAD 中文操作手册

GoCAD矢量汉字数据库的开发

 



buysoftware 2013-01-07 14:25 发表评论

    
最新技术文章:
▪修改月光博客网站中PHP常用正则表达式中出现...
▪js正则判断非法字符限制输入
▪通过正则表达式删除空行的方法
▪一个好用的正则匹配电话号手机号邮箱网址的...
▪JS 正则表达式用法介绍
▪几个小例子教你如何实现正则表达式highlight高...
▪如何实现正则表达式的JavaScript的代码高亮
▪js 玩转正则表达式之语法高亮
▪PHP中过滤常用标签的正则表达式
▪js 正则表达式学习笔记之匹配字符串
▪使用正则表达式匹配[***]样式的字符串
▪史上最详细的js日期正则表达式分享
▪php+正则将字符串中的字母数字和中文分割
▪正则表达式不区分大小写以及解决思路的探索...
▪正则替换换行符和把 br 替换成换行符
▪正则表达式匹配不包含某些字符串的技巧
▪匹配form表单中所有内容的正则表达式
▪正则表达式(括号)、[中括号]、{大括号}的区别...
▪正则表达式中的"g"是什么意思附件参数g的用...
▪浅谈正则表达式(Regular Expression)
▪Python正则表达式的七个使用范例详解
▪正则表达式提取img的src
▪常用的正则表达式集锦
▪使用正则表达式找出不包含特定字符串的条目...
▪js正则表达式中的问号几种用法小结
▪正则表达式概述 什么是正则表达式 .
▪ajax对注册名进行验证检测是否存在于数据库...
▪js正则解析URL参数示例代码
▪JS使用正则去除字符串最后的逗号
▪几种常见攻击的正则表达式
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3