精华内容
下载资源
问答
  • 多线程程序中,无论我们使用AfxBeginThread ,CreateThread,_beginthread构造线程函数,因为线程函数只能是全局函数或静态函数,下面拿静态函数来举例说明,静态函数中可以直接访问静态成员,但是访问类的非静态...

    在多线程程序中,无论我们使用AfxBeginThread ,CreateThread,_beginthread构造线程函数,因为线程函数只能是全局函数或静态函数,下面拿静态函数来举例说明,静态函数中可以直接访问静态成员,但是访问类的非静态函数或成员变量就必须做一个适配器,代码如下:

    class CStaticThread
    {
    public:
            static int ThreadFunc(LPVOID pParam);/
    protected:
        int ThreadFuncKernal();
    }

    void CStaticThread::Func()
       {
            AfxBeginThread(TreadFunc, this);
       }

       int CStaticThread::ThreadFunc(LPVOID pParam)
       {
           CStaticThread*pObj = (CStaticThread*)pParam;
           return pObj->ThreadFuncKernal();

       }

       // Thread function kernal
       int CStaticThread::ThreadFuncKernal()
       {
           while(1)
           {
               // my thread
               // to control class non-static member
           }
           return 0;
       }


    上面这个例子 是我们实际应用中这么操作的,下面讲讲static成员函数和非static成员的区别。

     

    static成员函数和成员变量的主要作用是针对类的,对所有的对象共享。声明为static的类成员或者成员函数便能在类的范围内共同享我们把这样的成员称做静态成员和静态成员函数。

    静态成员的初始化应该在主函数调用之前,并且不能在类的声明中出现静态成员的使用应该是类名称加域区分符加成员名称的,虽然我们仍然可以使用对象名加点操作符号加成员名称的方式使用,但是不推荐的,静态类成员的特性就是属于类而不专属于某一个对象。静态成员函数与普通成员函数的差别就在于缺少this指针。

     

    静态成员函数的作用:

    主要有两个作用:
         1、管理静态数据成员;
         2、提供类范围的功能,即不需要对象来实现的功能。

     

    由于一个类的静态成员函数只有一个拷贝,因此它访问对象的数据何函数使受到了限制。静态成员函数可以直接访问该类的静态数据成员。而访问非静态数据成员,必须通过参数传递方式得到对象名,然后通过对象名来访问。上面举得线程的例子就是通过参数传递得到对象名,然后通过对象来访问,这样在线程中,不但可以公有成员,也可以访问私有成员和成员函数;

     


    使用静态函数注意点:

    1)静态成员可以被继承,基类和派生类共享该静态成员;

    2)构造函数不能申明成静态的;

    因为构造函数是对每个对象进行初始化的,而静态函数是在类中的对象共享的,所以矛盾

    3)虚函数不能是静态函数;

    为什么虚函数必须是非静态成员函数
    如果定义为虚函数,那么它就是动态绑定的,也就是在派生类中可以被覆盖的,这与静态成员函数的定义本身就是相矛盾的。

     

     



     



     

    展开全文
  • 多线程访问同一函数

    2017-08-07 21:58:06
    多个线程访问同一函数时,一般情况下是互不影响的,但是当函数中存在全局变量或是static静态变量时,各个线程会得到不确定的结果
    多个线程访问同一函数时,一般情况下是互不影响的,但是当函数中存在全局变量或是static静态变量时,各个线程会得到不确定的结果
    
    展开全文
  • 同步函数synchronized是为了防止多线程同时访问同一对象而设置的函数、 学名为锁、  例如 public synchronized void show() { } 那么这锁的对象则是this 当前对象 如果 public static synchronized void...

    今天学习了一下多线程同步函数被static修饰的情况的例子、  写总结巩固下

    同步函数synchronized是为了防止多线程同时访问同一个对象而设置的函数、 学名为锁、 

    例如

    public synchronized void show() {  }  那么这个锁的对象则是this 当前对象

    如果

    public static  synchronized void show() { } 这个锁的对象是哪个呢? this? 还是.....  先看代码


    public class TicketDemo_Static
    {
        public static void main(String[] args)
        {
             Demo_Static d = new Demo_Static();
    
    		 Thread d1 = new Thread(d);
    		 Thread d2 = new Thread(d);
    			
    		 d1.start();
    		 try{Thread.sleep(10);}catch(Exception e){}
    		 d.falg = false;
    		 d2.start();
        } 
    }
    class Demo_Static implements Runnable
    {
    	private static int tick = 100;
    	boolean falg = true;
    	Object obj = new Object();
    	public  void run()
    	{
    		if (falg)
    		{
    			while(true)
    			{
    				synchronized (obj)
    				{
    					if (tick > 0)
    					{
    						try{Thread.sleep(10);}catch(Exception e){}
    						System.out.println(Thread.currentThread().getName() + "----code " + tick--);
    					}
    				}
    			}
    		}
    		else
    			while(true)
    				show();
    	}
    	public  static synchronized void show()//this
    	{
    		   if (tick > 0)
    			{
    			   try{Thread.sleep(10);}catch(Exception e){}
    				System.out.println(Thread.currentThread().getName() + "----show----" + tick--);
    			}
    	}
    }
    运行结果如下:



    最后一个结果为零 这是不安全的操作、  卖票怎么会有0号票 而且程序代码写了if (tick > 0) 这一个限制条件、 很明显锁不是同一把锁  再把代码改下 把锁的对象变为this


    /*
    java在静态方法的锁是字节码文件.class不是this
    */
    public class TicketDemo_Static
    {
        public static void main(String[] args)
        {
             Demo_Static d = new Demo_Static();
    
    		 Thread d1 = new Thread(d);
    		 Thread d2 = new Thread(d);
    			
    		 d1.start();
    		 try{Thread.sleep(10);}catch(Exception e){}
    		 d.falg = false;
    		 d2.start();
        } 
    }
    class Demo_Static implements Runnable
    {
    	private static int tick = 100;
    	boolean falg = true;
    	//Object obj = new Object();
    	public  void run()
    	{
    		if (falg)
    		{
    			while(true)
    			{
    				synchronized (this)//this
    				{
    					if (tick > 0)
    					{
    						try{Thread.sleep(10);}catch(Exception e){}
    						System.out.println(Thread.currentThread().getName() + "----code " + tick--);
    					}
    				}
    			}
    		}
    		else
    			while(true)
    				show();
    	}
    	public  static synchronized void show()//this
    	{
    		   if (tick > 0)
    			{
    			   try{Thread.sleep(10);}catch(Exception e){}
    				System.out.println(Thread.currentThread().getName() + "----show----" + tick--);
    			}
    	}
    }

    运行结果如下:


    和上次还是一样 没有任何区别:  那么很明显锁的对象不是同一个 有线程访问到了不同的对象、

    通过验证: 发现不是this 因为静态方法中不能定义this

    静态进内存、 内存中没有本类对象、 但是有该类对应的字节码文件对象、 所以对象是,class文件


    把代码做修改:

    synchronized (Demo_Static.class)//this

    运行结果如下:


    好了 经过多次验证 没有不安全的结果发生、 记录一下




    展开全文
  • #include <afxwin.h> #include <cstringt.h> #include <stdio.h>... printf("当前线程: %lu , 新的序列号: %s\n", ...此函数作用是获取一唯一的流水号: 会不会有可能出现重复的流水号?! 
  • 细细想想,对于静态函数来说,如果里面没有静态变量,函数内的局部变量应该都是临时分配的,俩线程同时访问应该也不会出现问题,两线程访问同一函数地址,但是不出错,有点意思,回头做试验试试看

    今天翻看函数库的时候发现有很多的静态函数,因为系统开发的时候考虑到用了多线程,当时也没细想会不会出问题,因为静态这个词在多线程开发中比较敏感,有点神经质了,O(∩_∩)O哈哈~,然后就泡杯茶,慢慢理,静静想,细细想想,对于静态函数来说,如果里面没有静态变量,函数内的局部变量应该都是临时分配的,俩线程同时访问应该也不会出现问题,两线程访问同一个函数地址,但是不出错,有点意思,回头做个试验试试看

    展开全文
  • Java多线程静态方法

    2016-04-26 11:52:43
    也就是说多线程访问同一类的static静态方法会发生什么事?是否会发生线程安全问题?   public class Test { public static void operation(){ // ... do something } }  事实证明只要在静态函数中没有...
  • 多线程调用函数

    2019-09-24 22:28:54
    不管是普通函数、静态函数、全局函数..每个线程都会在自己的线程栈区复制一份这个函数,所有可以随意使用,线程安全。 但是需要注意的是,如果这些函数内部对全局、静态变量进行了访问或修改,则不是线程安全的,...
  • 在某些条件下,比如说在使用诸如pthread(它不支持类)此类的多线程库时,就必须使用静态的成员函数,因为其地址同C语言函数的地址兼容。这种铜限制就迫使程序员要利用各种解决办法才能够从静态成员函数访问到非静态...
  • 只要在静态函数中没有处理线程共享数据,就不存在着多线程访问同一静态方法会出现资源冲突的问题,静态方法是否引起线程安全问题主要看该静态方法是否对全局变量(静态变量static member)进行修改操作
  • 终于把内存泄漏问题解决了,不是多线程访问静态函数的问题,事实证明只要在静态函数中没有处理线程共享数据,就不存在着线程访问同一静态方法会出现资源冲突的问题,如果在静态方法中有访问线程共享数据,...
  • 多线程构造函数

    2014-04-04 11:50:11
    1. 在构造函数一开始,this就是可用的了。 2. 构造函数和普通函数一样,并不是默认被... 如果构造函数访问静态变量的话,必须同步这静态变量,否则一定会出问题。 4. 如果只访问成员变量的话,无论在任...
  • JAVA多线程安全之构造函数

    千次阅读 2017-08-28 18:00:21
    在一般情况下,Java的构造函数总结如下: ... 如果只访问成员变量的话,无论在任何线程中,每一次构造函数被调用,其中的成员变量都是新建造出来的,因此不可能出现说在这个线程中运行的构造函数
  • 使用单例模式给人的感觉就是多个线程访问的时候,因为都是访问的同一个对象,比如add与get访问的时候感觉会阻塞成调用的队列一个个执行。其实仔细想想,单例模式就是new个对象,这个普通的对象线程安全是绝对没有...
  • 多线程访问数据库问题

    千次阅读 2018-03-06 21:02:23
    最近做一个线程的远程升级软件,做完后用一个对应的测试程序进行测试,发现线程一必崩溃,而把所有数据库处理全部删掉后,就可以同时运行几百个线程不崩溃了.原因应该是自己采用了单例模式,在各个线程中发送信号给...
  • 这篇文章主要讲线程对静态方法访问的数据安全性总结如下:1,java在执行静态方法时,会在内存中拷贝一份,如果静态方法所在的类里面没有静态的变量,那么线程访问就是安全的,比如在javaee中服务器必然会线程的...
  •  线程安全是编程中的术语,指某个函数函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。一般来说,线程安全的函数应该为每个调用它的线程分配专门的空间,来储存需要...
  • 这两天写一简单的程序,由于程序运行占用cpu比较厉害,导致运行中界面窗口无法交互,因此想到了多线程,以前没有接触过mfc多线程,在网上看了两篇文章,觉得也不过如此,就开始动手写了,结果发现即使是看别人写很...
  • 线程安全函数多个线程反复调用一个函数,它会一直产生一个正确结果;如何确保线程安全:处于同一进程的所有线程共享进程内存空间的全局区和堆,而私有的线程空间则包括栈和寄存器,对于同一进程的不同线程来说,每...
  • 可重入函数:一个被多个线程调用的函数没有引用任何共享数据(全局变量以及静态变量)。 如果一个函数被重入后,导致程序出现错误,则称该函数为不可重入函数。任何线程不安全问题的根源都是“共享数据”。所以不...
  • 静态构造函数

    2010-04-24 17:45:00
     静态构造的一些特性: 1、静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。 2、是在创建第一类实例或任何静态成员被引用时,.NET将自动调用静态...
  • 静态成员函数引用非静态成员

    千次阅读 2013-08-27 09:25:04
    C++会区分两种类型的成员函数静态成员函数和非...在某些条件下,比如说在使用诸如pthread(它不支持类)此类的多线程库时,就必须使用静态的成员函数,因为其地址同C语言函数的地址兼容。这种铜限制就迫使程序员要利
  • 在某些条件下,比如说在使用诸如pthread(它不支持类)此类的多线程库时,就必须使用静态的成员函数,因为其地址同C语言函数的地址兼容。这种铜限制就迫使程序员要利用各种解决办法才能够从静态成员函数访问到非静态...
  • 在某些条件下,比如说在使用诸如pthread(它不支持类)此类的多线程库时,就必须使用静态的成员函数,因为其地址同C语言函数的地址兼容。这种铜限制就迫使程序员要利用各种解决办法才能够从静态成员函数访问到非静态...
  • 在某些条件下,比如说在使用诸如pthread(它不支持类)此类的多线程库时,就必须使用静态的成员函数,因为其地址同C语言函数的地址兼容。这种铜限制就迫使程序员要利用各种解决办法才能够从静态成员函数访问到非静态...
  • C++静态构造函数的实现

    千次阅读 2013-10-13 01:53:43
    同时,CLR保证静态构造函数线程安全性(准确地说是,只会调用一次,不存在多线程问题)。 下面是MSDN对C++静态构造函数特点的描述: 1.静态构造函数既没有访问修饰符,也没有参数 2.在创建第一实例或...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 593
精华内容 237
关键字:

多个线程访问静态函数