互斥锁(mutex) 通过锁机制实现线程间的同步。
1、初始化锁。在Linux下,线程的互斥量数据类型是pthread_mutex_t。在使用前,要对它进行初始化。
2、静态分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
3、动态分配:int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr_t *mutexattr)
4、加锁。对共享资源的访问,要对互斥量进行加锁,如果互斥量已经上了锁,调用线程会阻塞,直到互斥量被解锁。
int pthread_mutex_lock(pthread_mutex *mutex)int pthread_mutex_trylock(pthread_mutex_t *mutex)
解锁。在完成了对共享资源的访问后,要对互斥量进行解锁。
int pthread_mutex_unlock(pthread_mutex_t *mutex)
销毁锁。锁在是使用完成后,需要进行销毁以释放资源。
int pthread_mutex_destroy(pthread_mutex *mutex)
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <pthread.h>
#include "iostream"
using namespace std
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
int tmp
void* thread(void *arg)
{
cout << "thread id is " << pthread_self() << endl
pthread_mutex_lock(&mutex)
tmp = 12
cout << "Now a is " << tmp << endl
pthread_mutex_unlock(&mutex)
return NULL
}
int main()
{
pthread_t id
cout << "main thread id is " << pthread_self() << endl
tmp = 3
cout << "In main func tmp = " << tmp << endl
if (!pthread_create(&id, NULL, thread, NULL))
{
cout << "Create thread success!" << endl
}
else
{
cout << "Create thread failed!" << endl
}
pthread_join(id, NULL)
pthread_mutex_destroy(&mutex)
return 0
}
//编译:g++ -o thread testthread.cpp -lpthread
处理死锁的策略1.忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。
2.检测死锁并且恢复。
3.仔细地对资源进行动态分配,以避免死锁。
4.通过破除死锁四个必要条件之一,来防止死锁产生。
检测死锁的代价很大。所有的类unix系统包括Linux对死锁不作任何处理,这是因为基于成本的考虑.选择鸵鸟算法
# kill -pid注释:标准的kill命令通常都能达到目的。终止有问题的进程,并把进程的资源释放给系统。然而,如果进程启动了子进程,只杀死父进程,子进程仍在运行,因此仍消耗资源。为了防止这些所谓的“僵尸进程”,应确保在杀死父进程之前,先杀死其所有的子进程。*确定要杀死进程的PID或PPID# ps -ef | grep httpd结束进程# kill -l PID-l选项告诉kill命令用好像启动进程的用户已注销的方式结束进程。当使用该选项时,kill命令也试图杀死所留下的子进程。但这个命令也不是总能成功--或许仍然需要先手工杀死子进程,然后再杀死父进程。给父进程发送一个TERM信号,试图杀死它和它的子进程。# kill -TERM PPID*killall命令killall命令杀死同一进程组内的所有进程。其允许指定要终止的进程的名称,而非PID。# killall httpd*停止和重启进程有时候只想简单的停止和重启进程。如下:该命令让Linux和缓的执行进程关闭,然后立即重启。在配置应用程序的时候,这个命令很方便,在对配置文件修改后需要重启进程时就可以执行此命令。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)