`
vearne
  • 浏览: 18909 次
  • 性别: 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系统编程之线程同步

    可理解为将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编程技术-多线程-网络编程

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

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

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

    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-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高级程序设计的关键知识点。此外,实验还会增强你对调试工具的使用,这对于...

    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`)可以用来定制新创建的线程的属性,如优先级、调度策略、栈大小等。通过设置合适的属性,开发者可以优化线程的行为,适应不同的系统...

    linux程序设计经典最新版--《linux程序设计(第四版)英文原版》

    另外,书中还会讨论线程编程,包括创建和管理线程,线程同步(互斥锁、条件变量等)以及线程安全问题。线程是提高多核处理器上程序并行性能的有效手段,理解线程编程能帮助开发者优化程序性能。 最后,为了帮助读者...

    基于韦东山的嵌入式Linux应用开发基础知识视频教程,我所练习而写的代码

    6. **test5.5 pthread cond_mutex**:这是更高级的线程同步机制,结合了条件变量和互斥锁,用于在满足特定条件时唤醒等待的线程。 7. **test6 TCP_pipe_signal**:这个可能是关于进程间通信(IPC)的,`pipe`是简单...

Global site tag (gtag.js) - Google Analytics