一.线程同步的概念
线程同步:是指在互斥的基础上,通过其它机制实现访问者对 资源的有序访问。 条件变量:线程库提供的专门针对线程同步的机制 线程同步比较典型的应用场合就是 生产者与消费者
二、生产者与消费者模型原理
在这个模型中,包括生产者线程与消费者线程。通过线程来模拟多个线程同步的过程 在这个模型中,需要以下组件
仓库 : 用于存储产品,一般作为共享资源 生产者线程 : 用于生产产品 消费者线程 : 用于消费产品
原理
当仓库没有产品时,则消费者线程需要等待,直到有产品时才能消费 当仓库已经装满产品时,则生产者线程需要等待,直到消费者线程消费产品之后
三、生产者与消费者模型同步
using namespace std;
# include <iostream>
# include <string>
# include <vector>
# include <deque>
# include <ctime>
# include <deque>
# include <cstdlib>
# include <pthread.h>
# include <unistd.h>
int production = 0 ;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void * start_routinue ( void * arg) { int nsems = atoi ( ( char * ) arg) ; for ( int i = 0 ; i < nsems; i++ ) { pthread_mutex_lock ( & mutex) ; production++ ; cout << pthread_self ( ) << "生产了" << production << endl; sleep ( 1 ) ; pthread_mutex_unlock ( & mutex) ; } pthread_exit ( NULL ) ;
}
int main ( int argc, char * argv[ ] ) { if ( argc < 2 ) { cout << "error" << endl; exit ( EXIT_FAILURE) ; } cout << argc << endl; int total_production = 0 ; int total_resumption = 0 ; vector< pthread_t> arr; for ( int i = 1 ; i < argc; i++ ) { arr. push_back ( i) ; } for ( int i = 0 ; i < arr. size ( ) ; i++ ) { total_production += atoi ( argv[ i + 1 ] ) ; int ret = pthread_create ( & ( arr. at ( i) ) , NULL , start_routinue, ( void * ) argv[ i + 1 ] ) ; if ( ret != 0 ) { cout << "create failed" << endl; exit ( EXIT_FAILURE) ; } } while ( 1 ) { pthread_mutex_lock ( & mutex) ; while ( production > 0 ) { total_resumption++ ; production-- ; cout << pthread_self ( ) << "消费了" << endl; sleep ( 1 ) ; } if ( total_resumption == total_production) { break ; } pthread_mutex_unlock ( & mutex) ; }
}