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,5


j+=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 problem

int 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

------------------------------------------------------------------------------------------------------------------------------


原创粉丝点击