多线程学习之四

在多线程学习的过程中,不可避免的是线程同步的问题了。

线程同步的方主要有以下四种法:

1、临界区:通过临界区实现多个线程对同一公共资源或一段代码的串行访问,速度快,适合控制数据的访问。

2、互斥量:通过协调线程共同对一个共享资源的单独访问而设计。

3、信号量:可以控制有限用户对同一资源的的访问而设计;

4、事件:通过通知线程的有一些事件已经发生,从而可以启动后续的任务执行。

在学习多线程的过程中,本人首先解除学习到的是互斥量。

学习互斥量的过程中主要使用到三个函数:

创建互斥量函数

HANDLE WINAPI CreateMutex(
  _In_opt_  LPSECURITY_ATTRIBUTES lpMutexAttributes,
  _In_      BOOL bInitialOwner,//初始拥有者
  _In_opt_  LPCTSTR lpName//互斥量名称
);
释放互斥量函数
BOOL WINAPI ReleaseMutex(
  _In_  HANDLE hMutex
);
信号等待函数:

DWORD WINAPI WaitForSingleObject(
  _In_  HANDLE hHandle,
  _In_  DWORD dwMilliseconds
);
而有关互斥量的知识如下:

互斥对象属于内核对象,它能够确保线程拥有对单个资源的互斥访问权。

互斥对象包含一个使用数量,一个线程ID和一个计数器。

ID用于标识系统中的哪个线程当前拥有互斥对象,计数器用于指明该线程拥有互斥对象的次数。

在使用互斥量的过程中尤其要注意一下几点:

1 谁拥有谁释放。当某一线程拥有互斥对象时,另外一个线程是不能通过ReleaseMutex函数来释放的,因为在调用ReleaseMutex时系统会首先把互    斥对象拥有者的线程ID与释放互斥对象的线程ID相比对,两个ID不同,对象是得不到释放的。

2某一线程对互斥对象的计数器减为0时,互斥对象才会得到释放;这是别的线程才能重新拥有互斥对象。这就是计数器的作用了。

3 当拥有互斥对象的线程结束时没有释放互斥对象,系统会随着该线程生命周期的结束自动释放其对互斥对象的拥有权,这是其他线程可申请互斥对象    的拥有权。

4如果希望在某一时间内程序只有一个实例获得运行,可以通过命名互斥对象来实现。

主程序实现如下线程入口函数的实现可参见上一篇

 SetProcessAffinityMask(GetCurrentProcess(),2); //设定运行的CPU
      HANDLE handle1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
      HANDLE handle2=CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);
	//  HANDLE handle3=CreateThread(NULL,0,ThreadProc3,NULL,0,NULL);
      CloseHandle(handle1);
      CloseHandle(handle2);
	  hMutex=CreateMutex(NULL,true,(LPCTSTR)"tickets");
	  if(hMutex)
		  if( ERROR_ALREADY_EXISTS==GetLastError())
			  {
				cout<<"only one instance can be runned!"<<endl;
				return;
			  }
	  WaitForSingleObject(hMutex,INFINITE);
	  ReleaseMutex(hMutex);
	  ReleaseMutex(hMutex);

至于其他多线程同步的方法,还有待学习!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python多线程是一种并发编程技术,可以同时执行多个线程,以提高程序的运行效率。在Python中,可以使用`threading`模块来实现多线程。 下面是一个简单的Python多线程示例: ```python import threading def worker(): print("Worker is running") # 创建线程对象 thread1 = threading.Thread(target=worker) thread2 = threading.Thread(target=worker) # 启动线程 thread1.start() thread2.start() # 等待所有线程结束 thread1.join() thread2.join() ``` 在上面的示例中,我们定义了一个`worker`函数,它会在控制台输出一条消息。然后我们创建了两个线程对象,并使用`start()`方法启动它们。最后,我们使用`join()`方法等待所有线程结束。 需要注意的是,多线程在Python中并不一定能够实现真正的并行执行,因为Python的GIL(全局解释器锁)机制限制了多线程的执行效率。这意味着即使在多个线程中同时执行相同的代码,也只有一个线程可以获得CPU资源进行执行。但是,Python多线程对于某些特定的任务仍然是非常有用的,例如I/O密集型任务或者使用多核CPU的系统。 在Python中学习多线程时,需要了解以下几点: 1. 线程的创建和启动:需要使用`Thread`类来创建线程对象,并使用`start()`方法来启动线程。 2. 线程的同步:由于GIL机制的存在,Python多线程并不能实现真正的并行执行。因此,需要使用锁、条件变量等机制来保证线程之间的同步和通信。 3. 线程池:可以使用线程池来管理多个线程,以提高程序的运行效率。Python中的`queue`模块提供了线程安全的队列,可以用于实现线程池。 4. 多进程:如果需要更高效的并发编程,可以使用Python的多进程模块`multiprocessing`。它可以更好地利用多核CPU的优势,并避免GIL的影响。 5. 锁的使用:在使用多线程时,需要使用锁来保证线程之间的同步和通信。需要注意避免死锁和竞争条件等问题。 6. 死锁问题:死锁是线程之间相互等待资源导致的问题,可以通过适当的调度策略和使用锁来避免死锁问题的发生。 7. 多线程的优点和缺点:多线程适用于I/O密集型任务和需要并发执行的任务。但是,它也存在一些缺点,如性能开销、资源竞争等问题。需要根据具体的应用场景来选择是否使用多线程。 总之,Python多线程是一种重要的并发编程技术,可以用于提高程序的运行效率。在学习Python多线程时,需要了解其基本原理和常见问题,并根据具体的应用场景来选择是否使用多线程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值