指南:工作者线程和信号量

原创 2003年04月02日 09:01:00

http://www.thebits.org/tutorials/mjsema.asp

 

指南:工作者线程和信号量

©Malcolm Smith, 14th October 2002

 

    和我们的所有指南一样,这个指南没有义务去处理随时可能发生的任何事。请看我们的法律信息页面。本文基于一个在Windows XP Professional下测试过的项目。

 

目录

作者

1

工作者线程和信号量

 

    什么是工作者线程?

1

    创建工作者线程并等待它们完成。

2

    摘要

2

下载源代码

下载源代码

 

作者

 

   Malcolm Smith(malcolm@mjfreelancing.com)-Owner of business MJ Freelancing. Check out

products available at www.mjfreelancing.com.

 

什么是工作者线程?

 

本文假定您已经具备如何在C++ Builder中创建线程的基础知识和诸如执行Execute方法,运行您的线程代码之类的基础条件。进入本文之前请阅读C++ Builder的相关文档。

 

您曾尝试写一个多线程应用程序,结果却发现当线程运行它们的任务时,带来了一些令人惊愕的中断吗?如果答案是“是”,那么本文就是为您准备的。

 

当处理集中的任务被执行时,应用程序以100%运行最常见的原因和您的“多线程”应用程序可能创建了多线程,但它们实际上不是独立运行的事实有关。这个大错误是为了运行其他线程而中断主VCL线程却在返回主线程并让第二个线程运行在它自己的空间时失败了。

 

为了达到本文的目的,我可以创建一个在文件和文件夹上迭代的线程。但为了使线程原理尽可能简单,我将用创建一个计算一个特定值并在窗体上更新标签的线程类来替代之。这个线程将和主VCL线程一起无障碍运行(同步更新标签的调用除外)。

 

class TWorkerThread : public TThread

{

private:

  int CountTo;

  int Counter;

  TLabel *pLabel;

protected:

  void __fastcall Execute(void);

  void __fastcall UpdateLabel(void);

public:

  __fastcall TWorkerThread(bool CreateSuspended,

      TLabel *ALabel, int ACountTo);

};

 

上面的线程类从一个TLabel获得指针。

 

下面显示线程的实现,很简单。

__fastcall TWorkerThread::TWorkerThread(bool CreateSuspended,
        TLabel *ALabel,int ACountTo)     : TThread(CreateSuspended), pLabel(ALabel)
{
Counter = 0;
CountTo = ACountTo;
}

void __fastcall TWorkerThread::Execute(void)
{
while(!Terminated && Counter++ < CountTo)
  {
  Synchronize(UpdateLabel);
  Sleep(100);   //
为了演示做的延时

  }
}

void __fastcall TWorkerThread::UpdateLabel(void)
{
if(pLabel)
  pLabel->Caption = IntToStr(Counter);
}

线程被执行,内部的记数器被置为0,要计算的值因而被初始化。

 

    本文附带的演示程序有一个名“Creation of simple threads”的节。每个按纽的代码都和下面显示的类似。

   

TWorkerThread *Thread = new TWorkerThread(true, Label1, 50);

Thread->FreeOnTerminate = true;

Thread->Resume();

  

这创建一个新线程,传递一个被更新的标签和一个计数器值。当线程是resumed时,标签的caption显示增加的值。再次点击同样的按钮,您会看到标签通过多线程被更新(直到计数器达到它的目标)

   

   这个组底部有一个另外的按纽,它模仿点击所有按纽。

 

   好了,那是一个简单的线程,它不阻塞主VCL线程,因为每一个创建的线程都是

独立运行的。

 

2 | 下载源代码

                                                                  (翻译:01soft

同步工具类三:计数信号量(java.util.concurrent.Semaphore)

信号量用来控制同时访问某个
  • a19881029
  • a19881029
  • 2014年07月08日 13:15
  • 3154

Linux多线程编程(三)-----生产者与消费者(条件变量,信号量)

Linux多线程编程(一):http://blog.csdn.net/llzk_/article/details/55670172 Linux多线程编程(二):http://blog.csdn.ne...
  • LLZK_
  • LLZK_
  • 2017年02月22日 21:02
  • 1664

通过生产者消费者问题比较信号量和信号【Java实现】

最近在看操作系统相关的内容,kandao
  • sunset108
  • sunset108
  • 2014年08月25日 13:40
  • 1731

C例子:信号量同步线程

  • 2016年01月27日 22:58
  • 3KB
  • 下载

跨平台的C++线程模板类和信号量及互斥量模板类

  • 2016年09月07日 08:57
  • 9KB
  • 下载

基于visual c++之windows核心编程代码分析(12)使用信号量同步线程

我们编写多线程应用程序的时候,经常需要进行线程同步协作,我们来实践一下用信号量同步线程。请见代码实现与注释分析, [cpp] view plain copy ...
  • flyingleo1981
  • flyingleo1981
  • 2016年12月08日 21:54
  • 246

基于visual c++之windows核心编程代码分析(12)使用信号量同步线程

我们编写多线程应用程序的时候,经常需要进行线程同步协作,我们来实践一下用信号量同步线程。请见代码实现与注释分析,/* 头文件 */ #include #include /* 常量定义 */ #de...
  • yincheng01
  • yincheng01
  • 2011年12月17日 11:49
  • 2220

线程同步3 ------ 信号量实现进程或者线程之间的同步

基本概念       信号量是一个计数器,常用于处理进程或线程的同步问题,特别是对临界资源访问的同步。临界资源可以简单地理解为在某一时刻只能由一个进程或线程进行操作的资源。信号量的值与相应资源的使用情...
  • str999_cn
  • str999_cn
  • 2017年12月14日 15:41
  • 42

Linux 线程锁 条件变量 信号量的区别2

之前一直没有怎么关注过这个问题,前些日子在面试一家公司的时候,面试官提到了pthread_cond_wait/pthread_cond_signal的实现,当时答的不是很好,回来就查了nptl的代码。...
  • sunnyboy_cia
  • sunnyboy_cia
  • 2011年03月25日 20:16
  • 2135

线程与同步之三——信号量

信号是 E. W. Dijkstra 在二十世纪六十年代末设计的一种编程架构。Dijkstra 的模型与铁路操作有关:假设某段铁路是单线的,因此一次只允许一列火车通过。信号将用于同步通过该轨道的火车。...
  • gws1229
  • gws1229
  • 2014年01月16日 14:22
  • 511
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:指南:工作者线程和信号量
举报原因:
原因补充:

(最多只允许输入30个字)