`
vearne
  • 浏览: 19361 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

linux线程同步--条件变量练习(1)

 
阅读更多

注意:消息是由主线程产生的,而消息这时候在栈中,两个线程通过全局变量获取访问消息。

Unix环境高级编程P288
进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本、程序的全局变量和堆内存、栈以及文件描述符。

 

#include <pthread.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);
	}
}

	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");
	sleep(1);
	struct msg msg1;
	msg1.data = 110;
	msg1.m_next = NULL;
	workq = NULL;
	enqueue_msg(&msg1);
	printf("add a msg\n");
	sleep(3);
	//pthread_cancel(tid1);
	//pthread_cancel(tid2);		
	printf("ok\n");
}

 

前面的程序访问的是主线程的栈区,下面的程序访问的是一个子线程的栈区。

可见线程之间是可以互相访问栈区的。

 

#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);
	}
}

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);
}
void* thr_fn2(void* arg){
	for(;;){
		struct msg temp;
		temp.data =120;
		temp.m_next = NULL;
		enqueue_msg(&temp);
		sleep(2);
	}
}
int main(){
	pthread_t tid1;
	pthread_t tid2;
	pthread_t tid3;
	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));
	}
	err = pthread_create(&tid3,NULL,thr_fn2,NULL);
	if(err!=0){
		err_quit("cant' create thread%s\n",strerror(err));
	}
	printf("create success.\n");
	//enqueue_msg(mp);
	//sleep(5);	
	sleep(20);
	pthread_cancel(tid1);
	pthread_cancel(tid2);
	//pthread_cancel(tid1);
	//pthread_cancel(tid2);		
	printf("ok\n");
}
 

 

分享到:
评论

相关推荐

    进程与线程--小练习

    在"进程与线程--小练习"这个主题中,可能包含了一些实践性的例子,比如创建和管理进程、线程的示例,或者展示了如何使用操作系统提供的API来实现进程间通信和线程同步。这些练习可以帮助学习者更好地理解和掌握进程...

    linux编程技术-多线程-网络编程

    学习如何创建、同步和管理线程,理解锁、信号量、条件变量等同步机制,以及如何避免死锁和资源竞争,是多线程编程的关键。多线程在数据库、Web服务器、科学计算等领域有广泛应用。 Linux窗口编程则主要指图形用户...

    linux编程基础-线程的练习-实验四.docx

    3. **线程同步**:为了避免多个线程同时访问共享资源导致的数据不一致问题,需要使用互斥锁(`pthread_mutex_t`)或条件变量(`pthread_cond_t`)等同步机制。本实验中主要关注线程间的等待,可以使用`pthread_join()`...

    Linux系统编程之线程同步

    可理解为将mutex--(或-1) int pthread_mutex_lock(pthread_mutex_t *mutex); pthread_mutex_unlock函数 解锁。可理解为将mutex ++(或+1) int pthread_mutex_unlock(pthread_mutex_t *mutex); pthread_mutex_...

    【Linux多线程编程】线程同步与互斥机制详解:关键工具及实际应用场景分析

    内容概要:本文详细介绍了Linux多线程编程中线程同步与互斥机制的重要性及其实现方式。线程同步确保多个线程按预定顺序执行,线程互斥保证对共享资源的排他性访问,避免数据不一致和竞态条件等问题。文中解释了互斥...

    linux之线程同步的概要介绍与分析

    学习Linux线程同步,推荐查阅以下资源: - **书籍**:《Advanced Programming in the UNIX Environment》(APUE)一书的相关章节。 - **文档**:Linux man pages 中关于`pthread`系列函数的详细说明。 - **实践项目*...

    实验二:Linux多线程创建.docx 完整实验报告(附代码)

    在本实验报告中,我们将深入探讨“实验二:Linux多...通过完成这个实验,你将能够编写出高效的多线程程序,理解和避免线程安全问题,以及熟练使用各种线程同步和通信机制。在后续的学习和工作中,这些技能将大有裨益。

    Linux 多线程介绍

    在Linux中,线程的操作涉及到一系列函数,如`pthread_create`用于创建线程,`pthread_join`用于等待线程结束,`pthread_mutex_lock`和`pthread_mutex_unlock`用于线程互斥,以及`pthread_cond_wait`和`pthread_cond_...

    Linux 多线程实现生产者消费者模式.pdf

    总结来说,Linux多线程实现生产者消费者模式涵盖了多线程创建、线程同步与互斥、锁机制、条件变量以及线程屏障等核心知识点。这些知识点是Linux下进行高级多线程编程不可或缺的部分,对于理解现代操作系统中多任务...

    【Linux多线程编程】pthread-create函数详解与线程传参技巧:创建、传参及多线程文件拷贝实战

    内容概要:本文详细介绍了Linux线程的概念、创建与传参的方法及其应用场景。首先解释了线程与进程的区别,强调线程在提升程序性能方面的作用,尤其是在多核处理器环境中。接着重点解析了`pthread_create`函数,包括...

    Linux-C-Program.zip_linux 编程

    6. **进程与线程**:介绍Linux下的进程和线程概念,包括进程创建、线程同步和通信机制,如互斥锁、信号量、条件变量等。 7. **内存管理**:C语言中的动态内存分配(malloc, free)和内存管理策略,以及如何避免内存...

    linux 进程线程小程序

    在Linux操作系统中,进程和线程是两个核心概念,它们是程序执行的载体。本教程“linux 进程线程小程序”将深入探讨这两个概念,以及如何利用信号量、管道和共享内存进行进程间的通信。 首先,让我们了解什么是进程...

    socket linux c++ 多线程3

    然而,多线程也带来了同步问题,如竞态条件和死锁,需要使用互斥量(`std::mutex`)、条件变量(`std::condition_variable`)等同步机制来避免。 标签中的"linux"意味着我们需要考虑Linux的特定特性,例如信号...

    实验5--Linux-高级程序设计.doc

    通过这个实验,你将深入理解Linux环境下的程序开发流程,熟悉gcc/g++工具链,掌握多线程编程,尤其是线程同步和互斥的实现,这些都是Linux高级程序设计的关键知识点。此外,实验还会增强你对调试工具的使用,这对于...

    【操作系统领域】Linux多线程编程详解:从基础概念到实战案例的全面解析

    文章还深入分析了线程间的同步与互斥问题,介绍了互斥量、条件变量、信号量等同步工具的应用,并通过生产者-消费者模型和读者-写者问题两个经典案例,演示了如何在实际编程中解决线程间的协作与冲突。最后,总结了多...

    POSIX Threads Programming

    - 条件变量是另一种同步原语,常与互斥锁配合使用,用于实现线程间的等待与通知机制。 - 条件变量允许线程在满足某些条件前暂停执行,直到另一个线程发出信号。 - **创建与销毁条件变量** - `pthread_cond_init...

    linux网络编程-源代码&课件.zip

    线程间的同步和互斥问题也是学习的重点,如使用`pthread`库中的`mutex`和`condition_variable`来确保数据一致性。 错误处理是任何网络编程中不可或缺的一部分。在Linux环境中,错误通常通过返回值和`errno`全局变量...

    操作系统多线程实验(只有代码)

    "On Work 1 多线程"可能包含创建和管理线程的代码示例,以及使用线程同步机制解决数据竞争问题的练习。实验可能涵盖以下几个方面: - 创建和销毁线程的实践 - 使用互斥锁实现线程同步 - 线程优先级和调度策略的...

    Linux从入门到精通学习文档

    ### Linux从入门到精通学习文档知识点汇总 #### 一、Linux入门篇 ##### 1.1 Linux操作系统简介 - **定义**: Linux是一种免费且可自由传播的类Unix操作系统,其设计灵感源自POSIX和UNIX标准。 - **特点**: - 多...

    POSIX多线程程序设计(中文)pdf

    条件变量则允许线程等待特定条件满足后再继续执行。 线程属性(`pthread_attr_t`)可以用来定制新创建的线程的属性,如优先级、调度策略、栈大小等。通过设置合适的属性,开发者可以优化线程的行为,适应不同的系统...

Global site tag (gtag.js) - Google Analytics