为什么要进行线程控制呢?就如同我和媳妇买了一辆车,我和我媳妇是共享这辆车的,就类似于线程共享进程的资源。当我们开车去拉萨的时候,我可以开车,她也可以开车,但是两个人不能同时开车,只能一个人来开,要不就会出问题。所以当我需要开车时,我就坐在驾驶的位置上,就相当于给线程上锁了,一旦我坐在驾驶座上,就是我来开车了,别人谁也别想开车,自己媳妇也是不行的。很明显,这是为了安全,是啊,线程控制也是为了安全,省的把数据弄乱了。
要想对线程加锁就要有加锁的方法,系统提供了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多线程访问控制管理分析
本文将深入探讨C#中的线程概念、创建与管理线程的方法,以及线程访问控制的相关知识。 1. **线程基础** - **线程定义**:线程是进程中的一个执行单元,每个进程至少包含一个线程,负责执行程序代码。 - **主线程*...
文档中讲解了C#中在使用多线程,跨线程操作时报错“线程间操作无效: 从不是创建控件“…”的线程访问它”的解决办法。
本文将深入探讨多线程访问网页这一主题,涵盖其原理、实现方式以及在实际应用中的挑战与优化策略。 一、多线程的基本概念 多线程是操作系统提供的一个特性,允许单个程序创建多个并发执行的线程。每个线程都有自己...
1. **线程同步与通信**:可以使用互斥锁(mutex)来保证对令牌桶的访问是线程安全的。当一个线程正在修改桶的状态(如添加令牌或消费令牌)时,其他线程必须等待。条件变量(condition variable)可以用来通知其他...
本文将深入探讨如何在多线程环境中实现进度条控制,并通过一个名为"progressctr"的示例来说明。 首先,我们要理解线程的概念。线程是程序执行的最小单元,每个线程都有自己的执行栈,可以在同一进程中并发执行。在...
本实例主要探讨如何在C#中创建和控制多线程,包括线程的启动、挂起和停止。 首先,要创建一个新的线程,可以使用`System.Threading.Thread`类。以下是一个简单的例子: ```csharp Thread newThread = new Thread...
这个名字暗示了线程访问控制,可能是一个关于线程调度和优先级的例子。C#中的`Thread.Priority`属性可以设置线程的优先级,但需要注意,过度依赖优先级可能会导致优先级反转和优先级继承等问题。 7. **C# 多线程 ....
标题和描述提及的“WinCe多线程访问winform中控件”是一个关键的编程挑战,因为不正确的操作可能会导致异常,如线程竞态条件、死锁或UI更新不一致。下面将详细探讨这个主题,以及如何有效地处理这些问题。 首先,...
本示例基于Visual Studio 2008,实现了《C++编程艺术》一书中关于多线程控制的实例。下面将详细讲解C++多线程的概念、实现方式以及在VS2008中的应用。 **1. C++多线程概念** 多线程是操作系统中的一种并发执行模型...
每个线程在执行时都会尝试访问这个资源,但在进入临界区之前,线程会先尝试获取临界区的控制权。如果控制权已被其他线程持有,那么该线程将被挂起,直到其他线程释放控制权。 示例还展示了两种不同的线程创建方法:...
在C#编程中,线程控制是一项至关重要的技能,尤其对于资源管理和高性能应用程序而言。线程使得程序可以同时执行多个任务,从而提高了系统的效率。本文将深入探讨C#中的线程控制,包括线程的基本概念、创建与管理线程...
在易语言中,多线程技术是一项重要的功能,它允许程序同时执行多个任务,提高程序运行效率,尤其是在处理大数据量或者需要并行操作的任务时,如多线程访问网页。 多线程访问网页是网络编程中的常见需求,尤其是在...
信号量(Semaphore)是一种经典的同步机制,用于控制对共享资源的访问。在易语言中,我们可以利用其提供的信号量API来实现线程间的同步与互斥。信号量值可以用来表示资源的可用数量,当线程试图获取一个资源时,如果...
MFC提供了各种同步机制,如CSemaphore、CCriticalSection和CMutex等,用于控制对共享资源的访问。同时,CWinThread类提供了PostThreadMessage()函数,可以向线程发送消息,实现线程间的通信。 6. **控制进度条**:...
在Python编程中,多线程是一种并发执行任务的机制,尤其在处理I/O密集型任务如网络请求时,能够显著提高程序效率。...在编写这样的程序时,我们需要关注线程安全、资源管理以及并发控制,以确保程序的正确性和高效性。
在多线程环境中,当多个线程访问共享资源时,如果没有适当的同步机制,可能会导致数据不一致或竞态条件。Java提供了多种同步工具,如`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`方法,以及`Lock`...
信号量可以控制同时访问资源的线程数量;临界区是轻量级的同步机制,适用于小范围的共享数据。 线程优先级: Windows系统允许设置线程的优先级,通过`SetThreadPriority`函数可以调整线程的执行优先级。不过需要...
2. **线程同步**:为了防止多个线程同时访问同一资源造成的数据不一致,需要使用同步机制,如互斥量、信号量、事件等。易语言提供了相应的同步对象,如"同步锁",用于控制线程的执行顺序。 3. **线程通信**:线程间...