注意:消息是由主线程产生的,而消息这时候在堆中,两个线程通过全局变量获取访问消息。
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
struct msg {
int data;
struct msg *m_next;
/* ... more stuff here ... */
};
struct msg *workq;
pthread_cond_t qready = PTHREAD_COND_INITIALIZER;
pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;
void
process_msg(void)
{
struct msg *mp;
for (;;) {
pthread_mutex_lock(&qlock);
while (workq == NULL)
pthread_cond_wait(&qready, &qlock);
mp = workq;
workq = mp->m_next;
pthread_mutex_unlock(&qlock);
/* now process the message mp */
printf("deal the mp. the data is %d\n",mp->data);
free(mp);
}
}
void
enqueue_msg(struct msg *mp)
{
pthread_mutex_lock(&qlock);
mp->m_next = workq;
workq = mp;
pthread_mutex_unlock(&qlock);
pthread_cond_signal(&qready);
}
void* thr_fn(void* arg){
process_msg();
return ((void*)1);
}
int main(){
pthread_t tid1;
pthread_t tid2;
int err;
err = pthread_create(&tid1,NULL,thr_fn,NULL);
if(err !=0){
err_quit("can't create thread%s\n",strerror(err));
}
err = pthread_create(&tid2,NULL,thr_fn,NULL);
if(err !=0){
err_quit("cant' create thread%s\n",strerror(err));
}
printf("create success.\n");
struct msg* mp = malloc(sizeof(struct msg));
mp->m_next = NULL;
mp->data = 110;
enqueue_msg(mp);
//sleep(5);
sleep(1);
pthread_cancel(tid1);
pthread_cancel(tid2);
//pthread_cancel(tid1);
//pthread_cancel(tid2);
printf("ok\n");
}
分享到:
相关推荐
在"进程与线程--小练习"这个主题中,可能包含了一些实践性的例子,比如创建和管理进程、线程的示例,或者展示了如何使用操作系统提供的API来实现进程间通信和线程同步。这些练习可以帮助学习者更好地理解和掌握进程...
学习如何创建、同步和管理线程,理解锁、信号量、条件变量等同步机制,以及如何避免死锁和资源竞争,是多线程编程的关键。多线程在数据库、Web服务器、科学计算等领域有广泛应用。 Linux窗口编程则主要指图形用户...
3. **线程同步**:为了避免多个线程同时访问共享资源导致的数据不一致问题,需要使用互斥锁(`pthread_mutex_t`)或条件变量(`pthread_cond_t`)等同步机制。本实验中主要关注线程间的等待,可以使用`pthread_join()`...
线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其它线程为保证数据一致性,不能调用该功能。 举例1: 银行存款 5000。柜台,折:取3000;提款机,卡:取 3000。剩余:2000 举例2...
内容概要:本文详细介绍了Linux多线程编程中线程同步与互斥机制的重要性及其实现方式。线程同步确保多个线程按预定顺序执行,线程互斥保证对共享资源的排他性访问,避免数据不一致和竞态条件等问题。文中解释了互斥...
学习Linux线程同步,推荐查阅以下资源: - **书籍**:《Advanced Programming in the UNIX Environment》(APUE)一书的相关章节。 - **文档**:Linux man pages 中关于`pthread`系列函数的详细说明。 - **实践项目*...
2. **Linux中的线程API**: 在Linux中,我们通常使用POSIX线程(pthread)库来创建和管理线程。关键函数包括: - `pthread_create()`:用于创建新的线程。 - `pthread_join()`:等待指定线程结束并回收资源。 - ...
在Linux中,线程的操作涉及到一系列函数,如`pthread_create`用于创建线程,`pthread_join`用于等待线程结束,`pthread_mutex_lock`和`pthread_mutex_unlock`用于线程互斥,以及`pthread_cond_wait`和`pthread_cond_...
总结来说,Linux多线程实现生产者消费者模式涵盖了多线程创建、线程同步与互斥、锁机制、条件变量以及线程屏障等核心知识点。这些知识点是Linux下进行高级多线程编程不可或缺的部分,对于理解现代操作系统中多任务...
内容概要:本文详细介绍了Linux线程的概念、创建与传参的方法及其应用场景。首先解释了线程与进程的区别,强调线程在提升程序性能方面的作用,尤其是在多核处理器环境中。接着重点解析了`pthread_create`函数,包括...
6. **进程与线程**:介绍Linux下的进程和线程概念,包括进程创建、线程同步和通信机制,如互斥锁、信号量、条件变量等。 7. **内存管理**:C语言中的动态内存分配(malloc, free)和内存管理策略,以及如何避免内存...
在Linux操作系统中,进程和线程是两个核心概念,它们是程序执行的载体。本教程“linux 进程线程小程序”将深入探讨这两个概念,以及如何利用信号量、管道和共享内存进行进程间的通信。 首先,让我们了解什么是进程...
然而,多线程也带来了同步问题,如竞态条件和死锁,需要使用互斥量(`std::mutex`)、条件变量(`std::condition_variable`)等同步机制来避免。 标签中的"linux"意味着我们需要考虑Linux的特定特性,例如信号...
通过这个实验,你将深入理解Linux环境下的程序开发流程,熟悉gcc/g++工具链,掌握多线程编程,尤其是线程同步和互斥的实现,这些都是Linux高级程序设计的关键知识点。此外,实验还会增强你对调试工具的使用,这对于...
文章还深入分析了线程间的同步与互斥问题,介绍了互斥量、条件变量、信号量等同步工具的应用,并通过生产者-消费者模型和读者-写者问题两个经典案例,演示了如何在实际编程中解决线程间的协作与冲突。最后,总结了多...
- 条件变量是另一种同步原语,常与互斥锁配合使用,用于实现线程间的等待与通知机制。 - 条件变量允许线程在满足某些条件前暂停执行,直到另一个线程发出信号。 - **创建与销毁条件变量** - `pthread_cond_init...
线程间的同步和互斥问题也是学习的重点,如使用`pthread`库中的`mutex`和`condition_variable`来确保数据一致性。 错误处理是任何网络编程中不可或缺的一部分。在Linux环境中,错误通常通过返回值和`errno`全局变量...
- **线程同步**:为了防止多个线程对共享资源的不正确访问,需要使用同步机制,如互斥锁、信号量、条件变量等。 - **线程调度**:操作系统负责线程的调度,根据不同的调度策略(如抢占式、非抢占式),决定哪个...
### Linux从入门到精通学习文档知识点汇总 #### 一、Linux入门篇 ##### 1.1 Linux操作系统简介 - **定义**: Linux是一种免费且可自由传播的类Unix操作系统,其设计灵感源自POSIX和UNIX标准。 - **特点**: - 多...
条件变量则允许线程等待特定条件满足后再继续执行。 线程属性(`pthread_attr_t`)可以用来定制新创建的线程的属性,如优先级、调度策略、栈大小等。通过设置合适的属性,开发者可以优化线程的行为,适应不同的系统...