当前位置:软件学习 > 其它软件 >>

多线程的那点儿事(之数据同步)

 

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

 

 

 

 

 

    多线程创建其实十分简单,在windows系统下面有很多函数可以创建多线程,比如说_beginthread。我们就可以利用它为我们编写一段简单的多线程代码,

 

 

#include <windows.h>  

#include <process.h>  

#include <stdio.h>  

 

unsigned int value = 0; 

 

void print(void* argv) 

    while(1){ 

        printf("&value = %x, value = %d\n", &value, value); 

        value ++; 

        Sleep(1000); 

    } 

 

int main() 

    _beginthread( print, 0, NULL ); 

    _beginthread( print, 0, NULL); 

 

    while(1)  

        Sleep(0); 

 

    return 1; 

       #include <windows.h>

       #include <process.h>

       #include <stdio.h>

      

       unsigned int value = 0;

      

       void print(void* argv)

       {

              while(1){

                     printf("&value = %x, value = %d\n", &value, value);

                     value ++;

                     Sleep(1000);

              }

       }

      

       int main()

       {

           _beginthread( print, 0, NULL );

              _beginthread( print, 0, NULL);

      

              while(1)

                     Sleep(0);

      

              return 1;

       }

 

    注意,在VC上面编译的时候,需要打开/MD开关。具体操作为,【project】->【setting】->【c/c++】->Category【Code Generation】->【Use run-time library】->【Debug Multithreaded】即可。

 

    通过上面的示例,我们看到作为共享变量的value事实上是可以被所有的线程访问的。这就是线程数据同步的最大优势——方便,直接。因为线程之间除了堆栈空间不一样之外,代码段和数据段都是在一个空间里面的。所以,线程想访问公共数据,就可以访问公共数据,没有任何的限制。

 

    当然,事物都有其两面性。这种对公共资源的访问模式也会导致一些问题。什么问题呢?我们看了就知道了。

 

    现在假设有一个池塘,我们雇两个人来喂鱼。两个人不停地对池塘里面的鱼进行喂食。我们规定在一个人喂鱼的时候,另外一个人不需要再喂鱼,否则鱼一次喂两回就要撑死了。为此,我们安装了一个牌子作为警示。如果一个人在喂鱼,他会把牌子设置为FALSE,那么另外一个人看到这个牌子,就不会继续喂鱼了。等到这个人喂完后,他再把牌子继续设置为TRUE。

 

    如果我们需要把这个故事写成代码,那么怎么写呢?朋友们试试看,

 

while(1){ 

    if( flag == true){ 

        flag = false; 

        do_give_fish_food(); 

        flag = true; 

    } 

 

    Sleep(0); 

       while(1){

              if( flag == true){

               flag = false;

                     do_give_fish_food();

                     flag = true;

              }

      

              Sleep(0);

       }

    上面的代码看上去没有问题了,但是大家看看代码的汇编代码,看看是不是存在隐患。因为还会出现两个人同时喂食的情况,

 

 

23:       while(1){ 

004010E8   mov         eax,1 

004010ED   test        eax,eax 

004010EF   je          do_action+56h (00401126) 

24:           if( flag == true){ 

004010F1   cmp         dword ptr [flag (00433e04)],1 

004010F8   jne         do_action+43h (00401113) 

25:               flag = false; 

004010FA   mov         dword ptr [flag (00433e04)],0 

26:               do_give_fish_food(); 

00401104   call        @ILT+15(do_give_fish_food) (00401014) 

27:               flag = true; 

00401109   mov         dword ptr [flag (00433e04)],1 

28:           } 

29:  www.zzzyk.com

30:           Sleep(0); 

00401113   mov         esi,esp 

00401115   push        0 

00401117   call        dword ptr [__imp__Sleep@4 (004361c4)] 

0

补充:软件开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,