如何让函数执行的过程中,不被其他线程打断?即保证函数执行体的原子性?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让函数执行的过程中,不被其他线程打断?即保证函数执行体的原子性?相关的知识,希望对你有一定的参考价值。
谢谢两位,似乎没法保证函数要执行就一定执行玩……CPU分片是个问题。如果能给两位都加分就好了。先采用 Zhang_Minghao的答案吧,虽然我的问题用这个解决不了。更感谢 doufuliu,感觉你阅历蛮深,呵呵。
1、初始化一个关键代码段结构。VOID InitializeCriticalSection(PCRITICAL_SECTION pcs);
2、一个线程进入关键代码段。
VOID EnterCriticalSection(PCRITICAL_SECTION pcs);
BOOL TryEnterCriticalSection(PCRITICAL_SECTION pcs);
3、对资源进行原子操作。
4、该线程离开关键代码段。
VOID LeaveCriticalSection(PCRITICAL_SECTION pcs);
5、删除关键代码段。
VOID DeleteCriticalSection(PCRITICAL_SECTION pcs); 参考技术A 你是说windows下么? 那是不可能的。
windows是一个非实时的,抢占式系统,cpu采用轮询的方式,调度所有进程。
不论你任务优先级多高,也会被低优先级的进程打断。或者被硬中断的响应函数打断。
不论你任务优先级多低,也有可能被cpu调度并执行。当然轮到你干活的时候,你可以主动放弃cpu时间。(比如Sleep,waitSignalObject)
vxwork,ucos或者linux(实时版)的操作系统下编程,是绝对会按照你分配的优先级工作的
即,高优先级的任务(进程) 只要不放弃cpu的使用。那它可以一直不被打断的工作。
相应的,低优先级的任务(进程)即使已经被执行,也可能被高优先级的任务无情的打断。
java多线程知识汇总如何选择锁?如何加锁
1.锁,保证的是被锁的代码,一次执行完毕才能被其他线程执行,锁保证了一个线程执行过程中不被其他线程打断。以保证数据的准确性。
2。数据的读写过程,是有冲突的,当一个线程正在读数据,另一个线程正在写同一个数据,就有可能导致数据不准确,造成脏数据。就要保证读写分开时间段。即加锁。
3.如果想要保证共享对象的一个方法按序执行,则在这个方法上加锁。
4.多个方法加同一个锁:在多个方法上加同一个锁。如果想保证读写能读取到准确数据,则在同一成员变量的对应读写方法上加同一个锁,同一个锁。保证读写正常。
5.同一个类中加不同的锁,比如一个加的this锁,一个加的object的锁,则此两个方法不受任何影响,多线程可以分别同时运行这两种各方法。
但是如果一个类的躲个方法加同一个锁,则只能按序访问。
下面举例说明,同一个类加不同的锁,一个this锁,一个同步代码块的object的锁。
单例对象包括不同的锁:
public class Student { private String age = "12"; private String name = "Tome"; private static Student student = new Student(); private Object object = new Object(); public void setName(String string) { synchronized (object) { System.out.println("i am running"); } } synchronized public String getNameAndAge() { return name+":"+age; } synchronized public void setNameAndAge(String name,String age) { this.name = name; this.age = age; } private Student() { } public static Student GetInstace() { return student; } }
线程1负责占用单例对象的this锁,且sleep让它一直占用
public class MyThread extends Thread { @Override public void run() { // TODO Auto-generated method stub Student.GetInstace().setNameAndAge("111", "111");//占用this锁的方法 try { System.out.println("i am sleeping");//打印输出我在休眠,一直占用this锁 Thread.currentThread().sleep(500);//睡眠,一直占用this锁,因为调用的是this锁的方法 System.out.println("i wake up");//打印输出我占用完毕 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
线程2负责执行object同步块代码,同步块调用的是另一个锁,即object锁。
public class AppMain implements Runnable{ public static void main(String[] args) { AppMain appMain = new AppMain(); MyThread thread2 = new MyThread(); thread2.start(); for(int i =0;i<200;i++) { Thread thread1 = new Thread(appMain); thread1.start(); } } @Override public void run() { // TODO Auto-generated method stub Student.GetInstace().setName("3333");//调用的是object锁的方法 }
打印继续向下看
结论:同一个类的不同锁,多线程在执行锁住的代码时,多线程不互联影响。
以上是关于如何让函数执行的过程中,不被其他线程打断?即保证函数执行体的原子性?的主要内容,如果未能解决你的问题,请参考以下文章