UNIX核心编程:多线程mutex函数详解

需积分: 43 75 下载量 24 浏览量 更新于2024-07-13 收藏 4.7MB PPT 举报
"这篇文档主要关注的是在UNIX核心编程中涉及的mutex变量的创建与销毁函数,以及UNIX操作系统的概述和其派生版本。在多线程编程中,mutex(互斥锁)是保证线程安全的重要工具。文档提到了以下几个关键函数: 1. `pthread_mutex_init(mutex, attr)` - 这个函数用于初始化一个互斥锁`mutex`。`mutex`是一个指向pthread_mutex_t类型的指针,`attr`是一个可选的属性参数,可以用来设置互斥锁的行为,如是否为递归锁等。如果不提供属性参数,可以传入NULL,使用默认属性。 2. `pthread_mutex_destroy(mutex)` - 该函数用于销毁已经初始化的互斥锁`mutex`。在不再需要互斥锁时调用此函数以释放系统资源。 3. `pthread_mutexattr_init(attr)` - 初始化一个互斥锁属性对象`attr`。这个函数允许你设置互斥锁的特定属性,如类型、协议等。 4. `pthread_mutexattr_destroy(attr)` - 销毁之前初始化的互斥锁属性对象`attr`,释放相关的内存资源。 在UNIX/Linux系统中,多线程编程是实现并发处理的重要手段,而mutex则是保证共享资源访问安全的基础。这些函数是UNIX/Linux标准库pthread的一部分,用于线程间的同步和互斥。 UNIX操作系统自1971年起源于AT&T的贝尔实验室,其特点包括多用户、多任务能力,并且支持多种硬件架构。UNIX有三个主要的派生版本:System V、Berkeley和Hybrid。System V派生出了如AIX、Solaris、HP-UX、IRIX等商业操作系统,而Berkeley派生出的FreeBSD、NetBSD、OpenBSD等则为开源系统,其中MacOS X的底层系统Darwin也基于FreeBSD。Hybrid派生中,Minix是一个小型的类Unix系统,而Linux则是一个广泛使用的开源类Unix操作系统,适用于各种硬件平台,从嵌入式设备到大型服务器。" 这篇文档不仅介绍了mutex变量的管理函数,还概述了UNIX操作系统的历史和派生版本,展现了UNIX家族的多样性以及其在现代操作系统中的重要地位。了解这些知识对于进行UNIX/Linux系统编程和理解操作系统原理至关重要。

注释下段代码void put(struct prodcons * b, int data) { pthread_mutex_lock(&b->lock);//上锁 /*等待缓冲区非满*/ if (b->writepos == 0){ printf("第十七个数,wait for not full\n"); pthread_cond_signal(&b->notempty); pthread_cond_wait(&b->notfull,&b->lock); } /*写数据并且指针前移*/ b->buffer[b->writepos] = data; b->writepos++; if (b->writepos >= BUFFER_SIZE) b->writepos = 0; /*设置缓冲区非空信号*/ pthread_mutex_unlock(&b->lock); if (data == -1){ printf("最后,生产任务结束\n"); pthread_cond_signal(&b->notempty); } } /*--------------------------------------------------------*/ /*从缓冲区中读出一个整数 */ int get(struct prodcons * b) { int data; pthread_mutex_lock(&b->lock); /* 等待缓冲区非空*/ if (0 == b->readpos){ pthread_cond_signal(&b->notfull); pthread_cond_wait(&b->notempty,&b->lock); printf("wait for not empty\n"); } /* 读数据并且指针前移 */ data = b->buffer[b->readpos]; b->readpos++; if (b->readpos >= (BUFFER_SIZE)) b->readpos = 0; /* 设置缓冲区非满信号*/ pthread_mutex_unlock(&b->lock); return data; } /*--------------------------------------------------------*/ #define OVER (-1) struct prodcons buffer; /*--------------------------------------------------------*/ void * producer(void * data) { int n; for (n = 0; n <= 96; n++) { printf(" put-->%d\n", n); put(&buffer, n); } put(&buffer, OVER); printf("producer stopped!\n"); return NULL; } /*--------------------------------------------------------*/ void * consumer(void * data) { int d; while (1) { d = get(&buffer); if (d == OVER ) break; printf(" %d-->get\n", d); } printf("consumer stopped!\n"); return NULL; } /*--------------------------------------------------------*/ int main(void) { pthread_t th_a, th_b; void * retval; init(&buffer); pthread_create(&th_a, NULL, producer, 0); pthread_create(&th_b, NULL, consumer, 0); /* 等待生产者和消费者结束 */ pthread_join(th_a, &retval); pthread_join(th_b, &retval); return 0; }

2023-06-08 上传
114 浏览量
2023-05-30 上传