<?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; cauloda</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/cauloda/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Mon, 28 May 2012 13:40:23 +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>多线程同步 2：使用内核对象</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/08/03/400008369/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/08/03/400008369/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 09:56:11 +0000</pubDate>
		<dc:creator>cauloda</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/08/03/400008369/</guid>
		<description><![CDATA[  调用线程必须切换到核心态。 1. 等待函数： WaitForSingleObject 返回值：WAIT_OBJECT_0、WAIT_TIMEOUT、WAIT_FAILED； WaitForMultipleObjects 返回值：除了上面三个，还可能是已经触发的内核对象数量； 2. 事件内核对象（Event）：自动重置（对等待函数有副作用）和手动重置 3. 可等待的计时器内核对象 用户计时器（发送WM_TIMER消息，此消息优先级是最低的） 4. 信号量（Semaphore） 5. 互斥量（mutex）：线程所有，ReleaseMutex时先检查与等待线程ID是否相同，其余内核对象则没有“线程所有权”概念]]></description>
			<content:encoded><![CDATA[<p> </p>
<p>调用线程必须切换到核心态。</p>
<p>1. 等待函数：<br />
WaitForSingleObject<br />
返回值：WAIT_OBJECT_0、WAIT_TIMEOUT、WAIT_FAILED；<br />
WaitForMultipleObjects<br />
返回值：除了上面三个，还可能是已经触发的内核对象数量；<br />
2. 事件内核对象（Event）：自动重置（对等待函数有副作用）和手动重置<br />
3. 可等待的计时器内核对象<br />
用户计时器（发送WM_TIMER消息，此消息优先级是最低的）<br />
4. 信号量（Semaphore）<br />
5. 互斥量（mutex）：线程所有，ReleaseMutex时先检查与等待线程ID是否相同，其余内核对象则没有“线程所有权”概念</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/08/03/400008369/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>多线程同步 1</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/08/03/400008366/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/08/03/400008366/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 09:54:40 +0000</pubDate>
		<dc:creator>cauloda</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/08/03/400008366/</guid>
		<description><![CDATA[  1. 原子访问：（从来不会把线程切换到等待状态） InterlockedExchangeAadd; // 原子加减 InterlockedIncrement; InterlockedExchange; // 原子赋值 应用：旋转锁（少用） InterlockedExchangePointer; 2. 高速缓存行： CPU会将所要取的内存数据的临近数据存到高速缓存行，因此将只读和可读写的数据适当分开组织可提高性能。 指针永远不需要volatile关键字修饰，因为会永远读取内存地址，编译器不会做任何优化。 3. 高级同步 关键段（critical section）：锁代码（只能在同一个进程中同步，无法指定最长等待时间：容易死锁） 如果有全局CRITICAL_SECTION对象，则可以用它锁不同的代码段； EnterCriticalSection和LeaveCriticalSection； 必须初始化和反初始化：IntializeCriticalSection和DeleteCriticalSection； 优点：内部使用Interlock函数，速度快； 缺点：无法用来在多个进程之间对进程进行同步； 多处理器调用没有问题，只有一个处理器的线程能执行，其余都要等待； 由于线程进入等待状态要被系统从用户态切换到内核态，因此在使用关键段是应该总是同时使用旋转锁： IntializeCriticalSectionAndSpinCount，旋转锁循环次数经典值是4000； Slim读/写锁 以上方法的线程同步将保证线程在用户态：速度快。]]></description>
			<content:encoded><![CDATA[<p> </p>
<p>1. 原子访问：（从来不会把线程切换到等待状态）<br />
InterlockedExchangeAadd; // 原子加减<br />
InterlockedIncrement;<br />
InterlockedExchange; // 原子赋值 应用：旋转锁（少用）<br />
InterlockedExchangePointer;</p>
<p>2. 高速缓存行：<br />
CPU会将所要取的内存数据的临近数据存到高速缓存行，因此将只读和可读写的数据适当分开组织可提高性能。<br />
指针永远不需要volatile关键字修饰，因为会永远读取内存地址，编译器不会做任何优化。</p>
<p>3. 高级同步<br />
关键段（critical section）：锁代码（只能在同一个进程中同步，无法指定最长等待时间：容易死锁）<br />
如果有全局CRITICAL_SECTION对象，则可以用它锁不同的代码段；<br />
EnterCriticalSection和LeaveCriticalSection；<br />
必须初始化和反初始化：IntializeCriticalSection和DeleteCriticalSection；<br />
优点：内部使用Interlock函数，速度快；<br />
缺点：无法用来在多个进程之间对进程进行同步；</p>
<p>多处理器调用没有问题，只有一个处理器的线程能执行，其余都要等待；<br />
由于线程进入等待状态要被系统从用户态切换到内核态，因此在使用关键段是应该总是同时使用旋转锁：<br />
IntializeCriticalSectionAndSpinCount，旋转锁循环次数经典值是4000；<br />
Slim读/写锁</p>
<p>以上方法的线程同步将保证线程在用户态：速度快。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/08/03/400008366/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

