注意:消息是由主线程产生的,而消息这时候在堆中,两个线程通过全局变量获取访问消息。
#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来实现进程间通信和线程同步。这些练习可以帮助学习者更好地理解和掌握进程...
线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其它线程为保证数据一致性,不能调用该功能。 举例1: 银行存款 5000。柜台,折:取3000;提款机,卡:取 3000。剩余:2000 举例2...
学习如何创建、同步和管理线程,理解锁、信号量、条件变量等同步机制,以及如何避免死锁和资源竞争,是多线程编程的关键。多线程在数据库、Web服务器、科学计算等领域有广泛应用。 Linux窗口编程则主要指图形用户...
3. **线程同步**:为了避免多个线程同时访问共享资源导致的数据不一致问题,需要使用互斥锁(`pthread_mutex_t`)或条件变量(`pthread_cond_t`)等同步机制。本实验中主要关注线程间的等待,可以使用`pthread_join()`...
学习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下进行高级多线程编程不可或缺的部分,对于理解现代操作系统中多任务...
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`)可以用来定制新创建的线程的属性,如优先级、调度策略、栈大小等。通过设置合适的属性,开发者可以优化线程的行为,适应不同的系统...
另外,书中还会讨论线程编程,包括创建和管理线程,线程同步(互斥锁、条件变量等)以及线程安全问题。线程是提高多核处理器上程序并行性能的有效手段,理解线程编程能帮助开发者优化程序性能。 最后,为了帮助读者...
6. **test5.5 pthread cond_mutex**:这是更高级的线程同步机制,结合了条件变量和互斥锁,用于在满足特定条件时唤醒等待的线程。 7. **test6 TCP_pipe_signal**:这个可能是关于进程间通信(IPC)的,`pipe`是简单...