30.Linux/Unix 系统编程手册(上) -- 线程:线程同步

1.互斥量
	互斥量可以帮助线程同步对共享资源的使用。
	确保同时只有一个线程可以访问某项共享资源,一旦线程锁定互斥量,随即称为该互斥量的所有者。只有所有者才能给互斥量解锁。

	pthread_mutex_lock();
	pthread_mutex_unlock();
	pthread_mutex_trylock();
	pthread_mutex_timedlock();

	如果使用 fcntl()进行加锁,解锁一片文件区域,总是要发起系统调用。与之相反,互斥量的实现采用了机器语言的原子操作,
  只有发送锁争用时才执行系统调用。

  死锁:
  	有时,一个线程需要同时访问2个或者更多不同的共享资源,而每个资源又都由不同的互斥量管理。当超过一个线程加锁同一组互斥量时,
  就有可能发送死锁。
  解决方法:
  	以相同的顺序加锁。

  1.互斥量的静态初始化
  static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; // 互斥量静态初始化,使用情况:经由静态分配且携带默认属性。

  2.互斥量的动态初始化
  pthread_mutex_init();
  下面情况必须使用动态初始化:
  	1.动态分配于堆中的互斥量
  	2.互斥量是在栈中分配的自动变量
  	3.初始化经由静态分配,且不使用默认属性的互斥量

  互斥量的销毁:
  	pthread_mutex_destroy();
  	静态分配的不用调用 pthread_mutex_destroy()。

  pthread_mutexattr_settype();

2.条件变量
	条件变量则允许线程互相通知共享变量的状态发送了变化。
	条件变量允许一个线程就某个共享变量的状态变化通知其他线程,并让其他线程等待(阻塞)这一通知。
	条件变量允许一个线程休眠,直至接获另外一个线程的通知去执行某些操作。
	条件变量总是结合互斥量使用,条件变量就是共享变量的状态改变发出通知,而互斥量则是提供对共享变量访问的互斥。

	由静态分配的条件变量:
	pthread_cond_t cond = PTHREAD_COND_INITIALIER;

	pthread_cond_signal();
	pthread_cond_broadcase();
	pthread_cond_wait();

	pthread_cond_signal 与 pthread_cond_broadcase 的区别在于,二者对阻塞与 pthread_cond_wait的多个线程的处理方式
  不同,pthread_cond_signal 函数只保证唤醒至少一条遭遇阻塞的线程,pthread_cond_broadcase 则会唤醒所有阻塞的线程。

    pthread_cond_timedwait();

 

猜你喜欢

转载自blog.csdn.net/enlyhua/article/details/82929059