首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

多线程的迷惑与思考(期待大牛释疑)

2013-08-09 
多线程的疑惑与思考(期待大牛释疑)本帖最后由 shb8845369 于 2013-07-29 06:38:39 编辑我一直这么想,多线

多线程的疑惑与思考(期待大牛释疑)
本帖最后由 shb8845369 于 2013-07-29 06:38:39 编辑 我一直这么想,多线程里各种锁的最终目的其实就是为了保护一块共享内存区数据在被CPU读写进Cache之前进行额外的认证。从汇编的角度看,在没有锁的情况下,读写内存的汇编代码大概像这样:Load/Store #Address, PC counter值不断减小直至为0,然后跳出Loop循环,完成一块内存的读写。

在多线程的程序中,为了保护这块共享内存,我们必须在读写共享内存这个代码段之前额外插入一段代码,并额外开辟一块新的内存(我的理解这就是所谓的锁/临界区)来对这块共享内存的状态进行记录,这样读写共享内存的代码被CPU执行之前,就会先执行这段插入的额外代码,并读写这块额外开辟的内存,来获得被保护的共享内存的内部状态,然后再决定对被保护的共享内存进行何种操作了。

从C++语言来看,下面这段代码中
WaitForSingleObject(hLock, INFINITE);  
  do_something();  
ReleaseMutex(hLock);  

1. WaitForSingleObject(hLock,INFINITE);是在对这块额外分配的内存(锁/临界区)进行读取,来获得共享内存的内部状态(被哪个线程正在读取啊, 可不可以写数据啊,etc.)
2. do_something();真正对共享内存进行各种读写操作
3. ReleaseMutex(hLock);一个线程读写完了,对额外分配的内存(锁/临界区)进行"重置",让其他线程有读写共享内存的机会~

以上全是个人理解,不知是否得当,还请各路高手指点一二,如有不对和错误的地方,请帮忙斧正,在此谢过! 多线程?内存?C++
[解决办法]
Program to demonstrate: NT's critical sections, plain mutexes and other mutexes
http://i1.dk/old_source/old/tmp/nt/fmnt.cpp
[解决办法]
多线程的话最好用关键段,比互斥锁要快很多。
互斥锁用于多进程的同步。
[解决办法]
无论单核多核,都是在系统调度下运行的,多个CPU核心,无非可以每个核心跑一个线程的代码。
而多核CPU有专门的同步指令,用于多核之间的同步。
由于核心数相对于实际,运行在CPU上的线程来说,是非常少的资源,实际上,线程是并行的串行运行的。

就是说,每个线程都是分时间片运行的,多个线程,可以在不同核心上并行运行。
单一线程是不会并行运行的,但是可以跑在多个核心上。

各种锁,其实就是线程调用API 跳转到系统调度程序,
或者某种原因,系统调度程序自动运行,
检查锁的数据结构状态,并通过同步指令,
使得这种检查是串行化的原子操作,从而不会出现线程对锁的干扰。

如果锁处在开的状态,线程接续运行,如果锁处在锁上状态,线程挂起;
系统调度程序让别的线程,进入运行状态。


[解决办法]
推荐阅读《30天自制操作系统》

热点排行