Multi-Thread problem
来源:互联网 发布:淘宝上的油画都是喷绘 编辑:程序博客网 时间:2024/06/05 14:23
Multi-Thread problem
int j=0;
main(){
create_thread(aa);
create_thread(bb);
printf("j=%d\n");
}
aa(){
j+=2;
}
bb(){
j+=3;
}
因为3个threads(main, aa, bb ) 运动的顺序不保证
所有j可能是0, 2, 3, 5
-----------------------------------------------------------------------------------------
main(){
create_thread(aa);
create_thread(bb);
//加入等待aa跟bb完成
printf("j=%d\n");
}
虽然确保了aa 跟 bb 运行完了 才去printf 但是j 答案还是可能是2,3,5j+=2 j+=3
load r0, j load r0, j
add r0, r0,2 add r0, r0,3
store r0, j store r0, j
1.Multi-Thread
2.global variable
3.有多个thread可以修改同一个global variable
4.所有这些修改的地方 用critical section等方式保证不被打断(缺点 效率低 虽然cpu是多内核 但是一次只能一个执行)
------------------------------------------------------------------------------------------
double free problem
Thread A:
aa(){
char *s =NULL;
s=(char*)malloc(100);
...
free(s);
....
free(s);
}
Thread B:
bb(){
char *s2 =NULL;
s2=(char*)malloc(100);
...
free(s2);
}
---------------------------------------------------------------------------------double free 避免
*声明时候 需要initialize
*所有resource free之后 全部改成initialize value
--------------------------------
Memory:
char *s = NULL;
s=(char*)malloc(100);
....
if(s){
free(s);
s=NULL; //就算在free 也没事情发生
}
--------------------------------
FILE
FILE *fp =NULL;
fp=fopen("aa.txt","r");
...
...
if(fp){
fclose(fp);
fp=NULL;
}
------------------------------
socket
int fd=0;
fd=socket(...);
...
...
if(fd){
close(fd);
fd=0
}
-------------------------------
----------------------------------------------------------------------------
bool g_flag=false;
main(){
create_thread(aa);
..
while(!g_flag); //等待aa结束
.. //aa做完了 继续往下
}
aa(){
...
g_flag=true;
}
本以为while如下
Label:
Load r0<-g_flag
Compare r0 and true
jne Label
实际上 compiler会认为g_flag没被修改过,会这么优化
Load r0<-g_flag
Label:
Compare r0 and true
jne Label
while永远不会结束
解决方式1:
在global变量之前加上volatile,主动告诉compile这个变量不需要optimize
使用时机:
1.multi-thread
2.global variable 用作flag
3.busy waiting的方式去测试这个flag(while)
解决方式2:
根本不需要用busy waiting的方式来做 thread synchronization
用event conditional variable
--------------------------------------------------------------------
cahe line problemint i,j,x,y;
aa(){
for(i=0;i<100;i++){ //只有一次需要40clk搬运 后面 只需要1clk就搬运成功
for(j=0;j<100; jj++){
}
}
----------------------
bb(){
//用到x,y
}
}
问题在于 aa修改i,j时候 set dirty to CPU2 cache bb修改x,y 时候 set dirty to CPU1de cache
本来之后只需要read from cache 用1clk 但是现在都要重新load 40clks
---------------------
结局方式cache line 切开 后面塞垃圾
int i,j, garbage1[m];
int x,y,garbage2[m];
一个cacheline 大概32bytes
个人理解 也就只有循环的时候 要注意 其他情况 一般都不会放在一起 都是需要去从memory load
------------------------------------------------------------------------------------------------------------------------------
- Multi-Thread problem
- Debug multi-thread problem with GDB
- multi-thread
- Multi-Thread
- multi thread
- [thread] multi-thread, thread attributes
- Multi-Thread Life
- WIN Multi-Thread Programe
- Thinking in Multi-thread
- About Multi-Thread
- multi thread links
- 转帖 multi thread
- Simple multi-thread worker
- Java Multi-thread Programming
- Multi-Thread 2---ThreadLocal
- 多线程Multi-Thread 基础
- .net multi Thread demo
- 笔记:Multi-Thread
- eclipes查看jar包中class文件,中文乱码问题
- ReactNative学习第五天 项目Header+顶部滑动切换
- mysql怎么使用 where in
- Data Binding 学习
- ABAP 中的搜索帮助
- Multi-Thread problem
- 用top,ps,jstack找到java线程异常代码
- Django05-表单
- InnoDB的MVCC如何解决幻读
- 变相解决 UnicodeDecodeError: 'utf8' codec can't decode byte0xc8 in position 9: invalid continuation byt
- 【安全牛学习笔记】 安装Java、安装显卡驱动、安装网卡补丁、并发线程限制、电源优化.txt
- .net core 下载并保存文件
- LintCode 通配符匹配
- Hive2.1.1 + mariadb-10.1.14-linux-x86_64 安装