Ⅰ 有两个问题关于c语言线程进程的,还望高手解答
程序的进度是以线程为单位向前推进的,很显然线程属于某一进程,进程拥有了程序实例的基本资源,在单核处理器的情况下,显然系统中只能有一个线程在执行,而在多核的情况就有些复杂了,要看程序与系统如何处理。
你说的锁应该是线程互斥量的使用,一般对于临界代码会使用类似于下面的代码
pthread_mutex_lock(&mysql_mutex);
// some critical code ...
pthread_mutex_unlock(&mysql_mutex);
其实系统中的锁并不是加给了要访问的资源或执行的代码,而是创建的互斥量,如果代码不使用下面的机制
pthread_mutex_lock(&mysql_mutex);
// some critical code ...
pthread_mutex_unlock(&mysql_mutex);
直接
// some critical code ...
这肯定是可以执行的,但是这背离了我们使用锁的初衷。
加锁进程对一互斥量加锁之后,是直接执行临界代码的,然后再释放互斥量,如果另一线程需要执行临界代码,同时又使用了锁的机制,那么它就会检查互斥量是否被锁住,如果被锁住会阻塞等待,若不是,就会为互斥量加锁,并随之进入临界代码,最后释放互斥量。
Ⅱ c语言多线程消费者与生产者----互斥锁与一般情况
问题是啥?你的mutex怎么不init
Ⅲ 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初始值
Ⅳ C语言实现死锁
如果是java就好了,无能为力呀!
Ⅳ C语言变量锁
在当前线程用mutex互斥锁把改变变量锁住,其他的线程在读写该变量前先获取该锁,这样如果主线程在使用了该锁,那其他线程就要等该锁被释放了,才能获取到该锁,才能对变量操作
Ⅵ c语言程序,多线程对同一int变量进行读写,是否需要加锁(貌似java中这是原子操作,不必加锁)
如果变量是总线程,也就是多线程都对该int进行读写,就要加锁……
Ⅶ C语言多线程问题
这涉及到进程/线程调度问题。cpu处理那个线程或者进程看系统实现,不存在顺序。
想要达到你的要求(可控线程执行顺序),需要使用线程同步的相关技术。
例如,线程锁,信号都可以。
sleep仅仅是饮鸩止渴,无法真正保证多线程或者进程间执行顺序。
Ⅷ (C语言中)互斥锁的死锁问题
如果你将mutex_c换成mutex_p,则不会死锁,因为,你第一个线程锁上后,切换到第二个线程,因为mutex_p未释放,第二个线程无法获取mutex_p,进入等待状态,此时OS将再次调度第一个线程,直到第一个线程释放mutex_p之后,第二个线程才会被激活,然后调试第二线程,获取mutex_p.
使用OS提供的互斥量来保护公共资源还是比较安全的,但如果用二值信号量的话,就可能会有优先级反转的情况.
Ⅸ 用C语言证明线程中的互斥锁可以是栈区变量或者堆区变量吗
最好是全局变量或者是全局对象的成员变量,当然如果能保障在多个线程运行中,互斥锁一直有效的话,成员变量也可以。
Ⅹ C语言互斥锁
C里面的线程锁这要看你用什么库了。不同的函数库api可能不同,我建议你可以参考一下apache的APR,那里面的库函数都可以跨平台使用,而且也不太复杂,看看它的帮助就能学会
参考网址:apr.apache.org