① C++ sync()的用法
不知道你用的是什么编译器,我做测试是sync()生效了(vc2013)
这是用了sync的:
② sync是什么
sync(意指Synchronize,即“同步”)为UNIX操作系统的标准系统调用,功能为将内核文件系统缓冲区的所有数据。
sync作为C语言的函数之一,sync()一般以void sync(void)的形式在unistd.h内声明。该函数也可以从命令行执行sync命令的方式调用,同时在其他程序语言(如Perl)中也有名字与之相似的函数。
UNIX中还有一些与sync相似的系统调用,如fsync与fdatasync。其中fsync负责写入所有与特定文件描述符相关的缓冲区数据;fdatasync功能与fsync相似,但只负责写入文件中被变更的数据,而不会修改文件的元数据(如文件属性)。
sync在数据库中的应用
在对数据进行修改操作(包括增、删、改)时,被修改的数据一般仅是暂存于基于内存的写入缓存,而当掉电时这些修改便会丢失;而为保证数据的持久性,数据库必须使用某些形式的sync,以确保修改的内容切实写入非易失性存储器,如PostgreSQL就使用了多种sync类调用(包括fsync与fdatasync)来达到这一目的。
但是,对于旋转寻道的硬盘来说,每次旋转只能完成一项“提交”操作以将客户端的修改写入,因此每秒最多只能完成几百次的“提交”操作;而若关闭fsync的限定来放宽要求,则可大幅提升性能,但同时也会带来系统崩溃后数据库损毁的潜在危险。有鉴于此,数据库也使用囊括最近修改信息的日志文件(一般比主题数据文件小得多)来保障可靠性:根据日志文件,系统管理员可以在系统崩溃后准确地重做修改操作,以此即可减少对主要数据文件的sync操作。
③ C语言同步和异步的区别
同步:代码立即执行
异步:代码程序先在队列排队,等到可以执行再去执行。
④ C语言中“sync();”是什么意思
sync是C语言的一个库函数。调用sync可以将系统缓冲区(内存中)的数据写入到文件系统(磁盘)中。x0dx0async的声明为:x0dx0ax0dx0aint sync(void);x0dx0a位于头文件unistd.h。x0dx0a当同步成功返回0,否则返回-1。x0dx0a功能为将系统缓冲区的内容写回磁盘,以确保数据同步。x0dx0a在操作系统中,除非设置了自动同步,否则为了减少磁盘的写入量,延长磁盘寿命,写入文件时并不是即时写入到磁盘中,而是先写入内存,这段内存区域被称为系统缓冲区。在系统缓冲区数据累计到一定数量后(具体数量因系统实际设置而定),会有系统进程一次性写入所有缓冲数据。这样,如果意外断电,那么系统缓冲区内数据就会因此丢失。于是在写入一些重要数据时,都会在写入结束后进行一次sync()的调用,保证数据已经被写入磁盘,降低数据丢失或损坏的可能性。
⑤ C语言如何在线程间实现同步和互斥
线程之间的同步和互斥解决的问题是线程对共同资源进行访问。Posix有两种方式:
信号量和互斥锁;信号量适用同时可用的资源为多个的情况;互斥锁适用于线程可用的资源只有一个的情况
1、互斥锁:互斥锁是用加锁的方式来控制对公共资源的原子操作(一旦开始进行就不会被打断的操作)
互斥锁只有上锁和解锁两种状态。互斥锁可以看作是特殊意义的全局变量,因为在同一时刻只有一个线程能够对互斥锁进行操作;只有上锁的进程才可以对公共资源进行访问,其他进程只能等到该进程解锁才可以对公共资源进行操作。
互斥锁操作函数:
pthread_mutex_init();//初始化
pthread_mutex_lock();//上锁 参数:pthread_mutex_t *mutex
pthread_mutex_trylock();//判断上锁 参数:pthread_mutex_t *mutex
pthread_mutex_unlock();//解锁 参数:pthread_mutex_t *mutex
pthread_mutex_release();//消除互斥锁 参数:pthread_mutex_t *mutex
互斥锁分为快速互斥锁、递归互斥锁、检错互斥锁;在 init 的时候确定
int pthread_mutex_t(pthread_mutex_t *mutex, const pthread_mutex_t mutexattr);
第一个参数:进行操作的锁
mutexattr:锁的类型,默认快速互斥锁(阻塞)123456789
2、信号量:信号量本质上是一个计数器,在操作系统做用于PV原子操作;
P操作使计数器-1;V操作使计数器+1.
在互斥操作中可以是使用一个信号量;在同步操作中需要使用多个信号量,并设置不同的初始值安排它们顺序执行
sem_init(); // 初始化操作
sem_wait(); // P操作,计数器减一;阻塞 参数:sem_t *sem
sem_trywait(); // P操作,计数器减一;非阻塞 参数:sem_t *sem
sem_post(); // V操作,计数器加一 参数:sem_t *sem
sem_destroy(); // 销毁信号量 参数:sem_t *sem
sem_init(sem_t *sem, int pshared, int value);
pshared用于指定多少个进程共享;value初始值