`
ydbc
  • 浏览: 766577 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

线程访问控制

 
阅读更多

为什么要进行线程控制呢?就如同我和媳妇买了一辆车,我和我媳妇是共享这辆车的,就类似于线程共享进程的资源。当我们开车去拉萨的时候,我可以开车,她也可以开车,但是两个人不能同时开车,只能一个人来开,要不就会出问题。所以当我需要开车时,我就坐在驾驶的位置上,就相当于给线程上锁了,一旦我坐在驾驶座上,就是我来开车了,别人谁也别想开车,自己媳妇也是不行的。很明显,这是为了安全,是啊,线程控制也是为了安全,省的把数据弄乱了。

要想对线程加锁就要有加锁的方法,系统提供了mutex来对线程进行加锁,当然这是一种互斥锁,互斥锁有两种状态,上锁和解锁。很同意明白,谁上锁谁操作呗,如同我把这个门锁起来了,这如同就是我家,只有我能进去操作。我操作完了,那就没我的事了,我就把锁放开,接着等待下一位上锁人。怎么赶脚有点像找女朋友呢?大笑


互斥锁可以分为快速互斥锁、递归互斥锁和检错互斥锁。快速互斥锁是指调用线程会阻塞直至拥有互斥锁的线程解锁。而检错互斥锁是快速互斥锁的非阻塞版本。递归互斥锁能够成功的返回并且调用线程在互斥上加锁的次数。

下面使用互斥锁对lock_var实现加一的操作。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int lock_var;
time_t end_time;

void pthread1(void *arg);
void pthread2(void *arg);

int main(int argc, char *argv[])
{
	pthread_t id1,id2;
	pthread_t mon_th_id;
	int ret;

	end_time = time(NULL)+10;
	//互斥锁初始化
	pthread_mutex_init(&mutex,NULL);
	//创建线程
	ret=pthread_create(&id1,NULL,(void *)pthread1, NULL);
	if(ret!=0)
		perror("pthread cread1");
	ret=pthread_create(&id2,NULL,(void *)pthread2, NULL);
	if(ret!=0)
		perror("pthread cread2");
		//等待线程的执行
	pthread_join(id1,NULL);
	pthread_join(id2,NULL);
	exit(0);
}

void pthread1(void *arg)
{
	int i;
	while(time(NULL) < end_time){
	//互斥锁上锁
		if(pthread_mutex_lock(&mutex)!=0){
		perror("pthread_mutex_lock");
		}
		else
			printf("pthread1:pthread1 lock the variable\n");
		for(i=0;i<2;i++){
			sleep(1);
			lock_var++;
		}
		//互斥锁解锁
		if(pthread_mutex_unlock(&mutex)!=0){
			perror("pthread_mutex_unlock");
		}
		else
			printf("pthread1:pthread1 unlock the variable\n");
	sleep(1);
	}
}

void pthread2(void *arg)
{
	int nolock=0;
	int ret;
	while(time(NULL) < end_time){
	//测试互斥锁
		ret=pthread_mutex_trylock(&mutex);
		if(ret==EBUSY)
			printf("pthread2:the variable is locked by pthread1\n");
		else{
			if(ret!=0){
				perror("pthread_mutex_trylock");
				exit(1);
			}
			else
				printf("pthread2:pthread2 got lock.The variable is %d\n",lock_var);
				//互斥锁解锁
			if(pthread_mutex_unlock(&mutex)!=0){
				perror("pthread_mutex_unlock");
			}
			 else
				printf("pthread2:pthread2 unlock the variable\n");
		}
		sleep(3);
	}
}

程序执行的结果:




分享到:
评论

相关推荐

    Java多线程访问控制管理分析.pdf

    Java多线程访问控制管理分析

    C#多线程C#线程及访问杂记

    本文将深入探讨C#中的线程概念、创建与管理线程的方法,以及线程访问控制的相关知识。 1. **线程基础** - **线程定义**:线程是进程中的一个执行单元,每个进程至少包含一个线程,负责执行程序代码。 - **主线程*...

    “线程间操作无效: 从不是创建控件“…”的线程访问它”的解决办法

    文档中讲解了C#中在使用多线程,跨线程操作时报错“线程间操作无效: 从不是创建控件“…”的线程访问它”的解决办法。

    多线程访问网页

    本文将深入探讨多线程访问网页这一主题,涵盖其原理、实现方式以及在实际应用中的挑战与优化策略。 一、多线程的基本概念 多线程是操作系统提供的一个特性,允许单个程序创建多个并发执行的线程。每个线程都有自己...

    Linux多线程实现令牌桶流量控制

    1. **线程同步与通信**:可以使用互斥锁(mutex)来保证对令牌桶的访问是线程安全的。当一个线程正在修改桶的状态(如添加令牌或消费令牌)时,其他线程必须等待。条件变量(condition variable)可以用来通知其他...

    多线程进度条控制基本方法演示

    本文将深入探讨如何在多线程环境中实现进度条控制,并通过一个名为"progressctr"的示例来说明。 首先,我们要理解线程的概念。线程是程序执行的最小单元,每个线程都有自己的执行栈,可以在同一进程中并发执行。在...

    C# 多线程控制实例

    本实例主要探讨如何在C#中创建和控制多线程,包括线程的启动、挂起和停止。 首先,要创建一个新的线程,可以使用`System.Threading.Thread`类。以下是一个简单的例子: ```csharp Thread newThread = new Thread...

    C#多线程编程关键技术教程及项目实例源码

    这个名字暗示了线程访问控制,可能是一个关于线程调度和优先级的例子。C#中的`Thread.Priority`属性可以设置线程的优先级,但需要注意,过度依赖优先级可能会导致优先级反转和优先级继承等问题。 7. **C# 多线程 ....

    WinCe多线程访问winform中控件

    标题和描述提及的“WinCe多线程访问winform中控件”是一个关键的编程挑战,因为不正确的操作可能会导致异常,如线程竞态条件、死锁或UI更新不一致。下面将详细探讨这个主题,以及如何有效地处理这些问题。 首先,...

    C++多线程控制例子

    本示例基于Visual Studio 2008,实现了《C++编程艺术》一书中关于多线程控制的实例。下面将详细讲解C++多线程的概念、实现方式以及在VS2008中的应用。 **1. C++多线程概念** 多线程是操作系统中的一种并发执行模型...

    多线程同步(多线程如何访问临界区资源)

    每个线程在执行时都会尝试访问这个资源,但在进入临界区之前,线程会先尝试获取临界区的控制权。如果控制权已被其他线程持有,那么该线程将被挂起,直到其他线程释放控制权。 示例还展示了两种不同的线程创建方法:...

    C#线程控制

    在C#编程中,线程控制是一项至关重要的技能,尤其对于资源管理和高性能应用程序而言。线程使得程序可以同时执行多个任务,从而提高了系统的效率。本文将深入探讨C#中的线程控制,包括线程的基本概念、创建与管理线程...

    易语言多线程访问网页

    在易语言中,多线程技术是一项重要的功能,它允许程序同时执行多个任务,提高程序运行效率,尤其是在处理大数据量或者需要并行操作的任务时,如多线程访问网页。 多线程访问网页是网络编程中的常见需求,尤其是在...

    易语言多线程控制:信号量控制线程数量

    信号量(Semaphore)是一种经典的同步机制,用于控制对共享资源的访问。在易语言中,我们可以利用其提供的信号量API来实现线程间的同步与互斥。信号量值可以用来表示资源的可用数量,当线程试图获取一个资源时,如果...

    使用MFC创建、销毁线程——控制进度条

    MFC提供了各种同步机制,如CSemaphore、CCriticalSection和CMutex等,用于控制对共享资源的访问。同时,CWinThread类提供了PostThreadMessage()函数,可以向线程发送消息,实现线程间的通信。 6. **控制进度条**:...

    python 多线程实现多个网址的多次快速访问

    在Python编程中,多线程是一种并发执行任务的机制,尤其在处理I/O密集型任务如网络请求时,能够显著提高程序效率。...在编写这样的程序时,我们需要关注线程安全、资源管理以及并发控制,以确保程序的正确性和高效性。

    多线程实现多控制两个案例

    在多线程环境中,当多个线程访问共享资源时,如果没有适当的同步机制,可能会导致数据不一致或竞态条件。Java提供了多种同步工具,如`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`方法,以及`Lock`...

    深入浅出Win32多线程程序设计之线程控制

    信号量可以控制同时访问资源的线程数量;临界区是轻量级的同步机制,适用于小范围的共享数据。 线程优先级: Windows系统允许设置线程的优先级,通过`SetThreadPriority`函数可以调整线程的执行优先级。不过需要...

    易语言源码易语言多线程高级控制源码.rar

    2. **线程同步**:为了防止多个线程同时访问同一资源造成的数据不一致,需要使用同步机制,如互斥量、信号量、事件等。易语言提供了相应的同步对象,如"同步锁",用于控制线程的执行顺序。 3. **线程通信**:线程间...

Global site tag (gtag.js) - Google Analytics