<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; woods2001</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/woods2001/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Mon, 28 May 2012 14:23:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>多线程编程-线程的创建和终止</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/09/22/400007583/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/09/22/400007583/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 05:33:27 +0000</pubDate>
		<dc:creator>woods2001</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/09/22/400007583/</guid>
		<description><![CDATA[1．引言： Linux系统下的多线程遵循POSIX线程接口，称为pthread。编写Linux下的多线程程序，需要使用头文件pthread.h，连接时需要使用库libpthread.a。顺便说一下，Linux下pthread的实现是通过系统调用clone（）来实现的。clone（）是Linux所特有的系统调用，它的使用方式类似fork，关于clone（）的详细情况，有兴趣的读者可以去查看有关文档说明。 　　pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义： 　　typedef unsigned long int pthread_t; 它是一个线程的标识符。 2．函数说明： （1）函数原型： #include int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void),void *restrict arg); 返回值：若是成功建立线程返回0,否则返回错误的编号 形式参数： pthread_t *restrict tidp 要创建的线程的线程id指针 const pthread_attr_t *restrict attr 创建线程时的线程属性 void* (start_rtn)(void) 返回值是void类型的指针函数 void *restrict arg start_rtn的行参 例题1： 功能：测试建立一个新的线程 程序名称： pthread_test.c #include #include void *create(void *arg) { printf("new thread created ..... [...]]]></description>
			<content:encoded><![CDATA[<p>1．引言：</p>
<p>Linux系统下的多线程遵循POSIX线程接口，称为pthread。编写Linux下的多线程程序，需要使用头文件pthread.h，连接时需要使用库libpthread.a。顺便说一下，Linux下pthread的实现是通过系统调用clone（）来实现的。clone（）是Linux所特有的系统调用，它的使用方式类似fork，关于clone（）的详细情况，有兴趣的读者可以去查看有关文档说明。</p>
<p>　　pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义：</p>
<p>　　typedef unsigned long int pthread_t;</p>
<p>它是一个线程的标识符。</p>
<p>2．函数说明：</p>
<p>（1）函数原型：</p>
<p>#include</p>
<p>int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void),void *restrict arg);</p>
<p>返回值：若是成功建立线程返回0,否则返回错误的编号</p>
<p>形式参数：</p>
<p>pthread_t *restrict tidp 要创建的线程的线程id指针</p>
<p>const pthread_attr_t *restrict attr 创建线程时的线程属性</p>
<p>void* (start_rtn)(void) 返回值是void类型的指针函数</p>
<p>void *restrict arg start_rtn的行参</p>
<p>例题1：</p>
<p>功能：测试建立一个新的线程</p>
<p>程序名称： pthread_test.c</p>
<p>#include</p>
<p>#include</p>
<p>void *create(void *arg)</p>
<p>{</p>
<p>printf("new thread created ..... ");</p>
<p>}</p>
<p>int main(int argc,char *argv[])</p>
<p>{</p>
<p>pthread_t tidp;</p>
<p>int error;</p>
<p>error=pthread_create(&amp;tidp,NULL,create,NULL);</p>
<p>if(error!=0)</p>
<p>{</p>
<p>printf("pthread_create is not created ... ");</p>
<p>return -1;</p>
<p>}</p>
<p>printf("prthread_create is created... ");</p>
<p>return 0;</p>
<p>}</p>
<p>编译方法：</p>
<p>#gcc -Wall -lpthread pthread_test.c</p>
<p>因为pthread的库不是linux系统的库，所以在进行编译的时候要加上-lpthread，否则编译不过，会出现下面错误:</p>
<p>thread_test.c: 在函数 ‘create’ 中：</p>
<p>thread_test.c:7: 警告： 在有返回值的函数中，程序流程到达函数尾</p>
<p>/tmp/ccOBJmuD.o: In function `main':thread_test.c:(.text+0x4f)：对‘pthread_create’未定义的引用</p>
<p>collect2: ld 返回 1</p>
<p>2、线程的终止与结束</p>
<p>(1) 终止线程</p>
<p>函数原型：void pthread_exit(void *status);</p>
<p>参数：其中*retval为线程退出的状态。这个函数一般在线程中途退出时使用。</p>
<p>作用：此函数的作用是使当前线程退出并释放它使用的线程相关资源。</p>
<p>返回值: 当调用线程是进程中的最后一个非守护线程，进程将用状态0退出。当最初的线程从main()函数中返回时进程用该线程main函数的返回值退出。</p>
<p>(2) 等待线程结束</p>
<p>原型如下：</p>
<p>int pthread_join(pthread_t th, void **thread_return)</p>
<p>参数：th 为被等待的线程标识符</p>
<p>thread_return 为一个用户定义的指针，它可以用来存储被等待线程的返回值</p>
<p>作用：函数pthread_join用来等待一个线程的结束。</p>
<p>说明： 这个函数是一个线程阻塞的函数，调用它的函数将一直等待到被等待的线程结束为止，当函数返回时，被等待线程的资源被收回。此函数用于进程和线程的同步，防止主线程提前结束，致使其它线程无法执行。如主线程创建了两个线程，就有可能在两个派生线程没有执行时，主线程就已经结束了，而主线程结束，对系统而言，就意味这个进程已经结束，那么派生线程自然就没有机会执行了。所以用pthread_join等待派生线程的结束</p>
<p>返回值：调用成功时返回0，否则将返回一个非0的错误代码。</p>
<p>（3）分离线程pthread_detach</p>
<p>int pthread_detach(pthread_t tid);</p>
<p>作用：将非分离的线程设置为分离线程。即通知线程库在指定的线程终止时回收线程占用的内存等资源。</p>
<p>返回值：函数成功返回0。任何其他返回值都表示错误。</p>
<p>在一个线程上使用多次pthread_detach的结果是不可预见的。</p>
<p>（4）线程的取消</p>
<p>当我们希望终止一个线程时，我们可以使用函数pthread_cancel()。其原型定义如下：</p>
<p>原型： int pthread_cancel(pthread_t thread);</p>
<p>说明：这个函数以一个线程ID作为参量，向此线程发送一个取消请求。线程处理这个请求的方式取决于线程的状态。它可能立即作出反映，也可能等到它得到一个取消点时在行动，也可能完全忽略它。</p>
<p>（5）设置线程取消状态</p>
<p>线程可以用pthread_setcancelstate函数来设置自己的取消状态，</p>
<p>原型定义如下：int pthread_setcancelstate(int state, int *oldstate);</p>
<p>参数说明：</p>
<p>state 取值可以是PTHREAD_CNACEL_ENABLE，这个值允许线程接收取消请求；或是PTHREAD_CNACEL_ENABLE，它的作用是忽略取消请求。</p>
<p>oldstate 用于获取先前的取消状态。如果取消请求接受了，线程可以进入第二个控制层次，用pthread_setcanceltype设置取消类型。</p>
<p>（6）设置取消类型</p>
<p>原型定义如下：int pthread_setcanceltype(int type, int *oldtype);</p>
<p>参数说明：</p>
<p>type 取值可以是PTHREAD_CANCEL_ASYNCHRONOUS，它将使得线程在接收到取消请求后立即处理(asynchronous)，或是PTHREAD_CANCEL_DEFERRED，它将使得线程在接收到取消请求后，一直推迟处理，直到遇到一个取消点（defer）之后才处理。</p>
<p>odtype 作用是允许保存先前的状态，如果不想直到先前的状态，可以传递NULL给它。</p>
<p>在默认的情况下，线程在启动是的取消状态为PTHREAD_CNACEL_ENABLE，取消类型为PTHREAD_CANCEL_DEFERRED。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/09/22/400007583/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>多线程编程 - 线程的创建和终止</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/07/04/400008237/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/07/04/400008237/#comments</comments>
		<pubDate>Mon, 04 Jul 2011 03:03:06 +0000</pubDate>
		<dc:creator>woods2001</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/07/04/400008237/</guid>
		<description><![CDATA[  1．引言： Linux系统下的多线程遵循POSIX线程接口，称为pthread。编写Linux下的多线程程序，需要使用头文件pthread.h，连接时需要使用库libpthread.a。顺便说一下，Linux下pthread的实现是通过系统调用clone（）来实现的。clone（）是Linux所特有的系统调用，它的使用方式类似fork，关于clone（）的详细情况，有兴趣的读者可以去查看有关文档说明。 　　pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义： 　　typedef unsigned long int pthread_t; 它是一个线程的标识符。 2．函数说明： （1）函数原型： #include int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void),void *restrict arg); 返回值：若是成功建立线程返回0,否则返回错误的编号 形式参数： pthread_t *restrict tidp 要创建的线程的线程id指针 const pthread_attr_t *restrict attr 创建线程时的线程属性 void* (start_rtn)(void) 返回值是void类型的指针函数 void *restrict arg start_rtn的行参 例题1： 功能：测试建立一个新的线程 程序名称： pthread_test.c #include #include void *create(void *arg) { printf("new thread created [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p>1．引言：</p>
<p>Linux系统下的多线程遵循POSIX线程接口，称为pthread。编写Linux下的多线程程序，需要使用头文件pthread.h，连接时需要使用库libpthread.a。顺便说一下，Linux下pthread的实现是通过系统调用clone（）来实现的。clone（）是Linux所特有的系统调用，它的使用方式类似fork，关于clone（）的详细情况，有兴趣的读者可以去查看有关文档说明。</p>
<p>　　pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义：</p>
<p>　　typedef unsigned long int pthread_t;</p>
<p>它是一个线程的标识符。</p>
<p>2．函数说明：</p>
<p>（1）函数原型：</p>
<p>#include</p>
<p>int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void),void *restrict arg);</p>
<p>返回值：若是成功建立线程返回0,否则返回错误的编号</p>
<p>形式参数：</p>
<p>pthread_t *restrict tidp 要创建的线程的线程id指针</p>
<p>const pthread_attr_t *restrict attr 创建线程时的线程属性</p>
<p>void* (start_rtn)(void) 返回值是void类型的指针函数</p>
<p>void *restrict arg start_rtn的行参</p>
<p>例题1：</p>
<p>功能：测试建立一个新的线程</p>
<p>程序名称： pthread_test.c</p>
<p>#include</p>
<p>#include</p>
<p>void *create(void *arg)</p>
<p>{</p>
<p>printf("new thread created ..... ");</p>
<p>}</p>
<p>int main(int argc,char *argv[])</p>
<p>{</p>
<p>pthread_t tidp;</p>
<p>int error;</p>
<p>error=pthread_create(&amp;tidp,NULL,create,NULL);</p>
<p>if(error!=0)</p>
<p>{</p>
<p>printf("pthread_create is not created ... ");</p>
<p>return -1;</p>
<p>}</p>
<p>printf("prthread_create is created... ");</p>
<p>return 0;</p>
<p>}</p>
<p>编译方法：</p>
<p>#gcc -Wall -lpthread pthread_test.c</p>
<p>因为pthread的库不是linux系统的库，所以在进行编译的时候要加上-lpthread，否则编译不过，会出现下面错误:</p>
<p>thread_test.c: 在函数 ‘create’ 中：</p>
<p>thread_test.c:7: 警告： 在有返回值的函数中，程序流程到达函数尾</p>
<p>/tmp/ccOBJmuD.o: In function `main'':thread_test.c:(.text+0x4f)：对‘pthread_create’未定义的引用</p>
<p>collect2: ld 返回 1</p>
<p>2、线程的终止与结束</p>
<p>(1) 终止线程</p>
<p>函数原型：void pthread_exit(void *status);</p>
<p>参数：其中*retval为线程退出的状态。这个函数一般在线程中途退出时使用。</p>
<p>作用：此函数的作用是使当前线程退出并释放它使用的线程相关资源。</p>
<p>返回值: 当调用线程是进程中的最后一个非守护线程，进程将用状态0退出。当最初的线程从main()函数中返回时进程用该线程main函数的返回值退出。</p>
<p>(2) 等待线程结束</p>
<p>原型如下：</p>
<p>int pthread_join(pthread_t th, void **thread_return)</p>
<p>参数：th 为被等待的线程标识符</p>
<p>thread_return 为一个用户定义的指针，它可以用来存储被等待线程的返回值</p>
<p>作用：函数pthread_join用来等待一个线程的结束。</p>
<p>说明： 这个函数是一个线程阻塞的函数，调用它的函数将一直等待到被等待的线程结束为止，当函数返回时，被等待线程的资源被收回。此函数用于进程和线程的同步，防止主线程提前结束，致使其它线程无法执行。如主线程创建了两个线程，就有可能在两个派生线程没有执行时，主线程就已经结束了，而主线程结束，对系统而言，就意味这个进程已经结束，那么派生线程自然就没有机会执行了。所以用pthread_join等待派生线程的结束</p>
<p>返回值：调用成功时返回0，否则将返回一个非0的错误代码。</p>
<p>（3）分离线程pthread_detach</p>
<p>int pthread_detach(pthread_t tid);</p>
<p>作用：将非分离的线程设置为分离线程。即通知线程库在指定的线程终止时回收线程占用的内存等资源。</p>
<p>返回值：函数成功返回0。任何其他返回值都表示错误。</p>
<p>在一个线程上使用多次pthread_detach的结果是不可预见的。</p>
<p>（4）线程的取消</p>
<p>当我们希望终止一个线程时，我们可以使用函数pthread_cancel()。其原型定义如下：</p>
<p>原型： int pthread_cancel(pthread_t thread);</p>
<p>说明：这个函数以一个线程ID作为参量，向此线程发送一个取消请求。线程处理这个请求的方式取决于线程的状态。它可能立即作出反映，也可能等到它得到一个取消点时在行动，也可能完全忽略它。</p>
<p>（5）设置线程取消状态</p>
<p>线程可以用pthread_setcancelstate函数来设置自己的取消状态，</p>
<p>原型定义如下：int pthread_setcancelstate(int state, int *oldstate);</p>
<p>参数说明：</p>
<p>state 取值可以是PTHREAD_CNACEL_ENABLE，这个值允许线程接收取消请求；或是PTHREAD_CNACEL_ENABLE，它的作用是忽略取消请求。</p>
<p>oldstate 用于获取先前的取消状态。如果取消请求接受了，线程可以进入第二个控制层次，用pthread_setcanceltype设置取消类型。</p>
<p>（6）设置取消类型</p>
<p>原型定义如下：int pthread_setcanceltype(int type, int *oldtype);</p>
<p>参数说明：</p>
<p>type 取值可以是PTHREAD_CANCEL_ASYNCHRONOUS，它将使得线程在接收到取消请求后立即处理(asynchronous)，或是PTHREAD_CANCEL_DEFERRED，它将使得线程在接收到取消请求后，一直推迟处理，直到遇到一个取消点（defer）之后才处理。</p>
<p>odtype 作用是允许保存先前的状态，如果不想直到先前的状态，可以传递NULL给它。</p>
<p>在默认的情况下，线程在启动是的取消状态为PTHREAD_CNACEL_ENABLE，取消类型为PTHREAD_CANCEL_DEFERRED。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/07/04/400008237/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

