信号量多线程同步

<span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">使线程同步</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">  在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解。正常情况下对这种处理结果的了解应当在其处理任务完成后进行。</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">  如果不采取适当的措施,其他线程往往会在线程处理任务结束前就去访问处理结果,这就很有可能得到有关处理结果的错误了解。例如,多个线程同时访问同一个全局变量,</span><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">如果都是读取操作,则不会出现问题</span><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">。如果一个线程负责改变此变量的值,而其他线程负责同时读取变量内容,则不能保证读取到的数据是经过写线程修改后的。</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">  为了确保读线程读取到的是经过修改的变量,</span><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">就必须在向变量写入数据时禁止其他线程对其的任何访问</span><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">,</span><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">直至赋值过程结束后再解除对其他线程的访问限制</span><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">。象这种保证线程能了解其他线程任务处理结束后的处理结果而采取的保护措施即为线程同步。</span>
#include <iostream>
#include <Windows.h>
using namespace std;
HANDLE hSemaphnore1;
HANDLE hSemaphnore2;
int global_variable =0;
void Threadfun1(LPVOID pParam)
{
    WaitForSingleObject(hSemaphnore1,INFINITE);
    while(1)
    {
        global_variable++;
        printf("%d\n",global_variable);
        Sleep(100);  //睡眠下,让其他线程有机会抢占
        if(global_variable ==10)
        {
            ReleaseSemaphore(hSemaphnore2, 1, NULL);  //通知线程2
            WaitForSingleObject(hSemaphnore1,INFINITE); //让线程1等待
        }
    }
}
void Threadfun2(LPVOID nParam)
{
    WaitForSingleObject(hSemaphnore2,INFINITE);
    while(1)
    {
        global_variable--;
        printf("%d\n",global_variable);
        Sleep(100);
        if(global_variable ==0)
        {
            ReleaseSemaphore(hSemaphnore1, 1, NULL); //通知线程1
            WaitForSingleObject(hSemaphnore2,INFINITE);
        }
    }
}
int main()
{
    DWORD threadLidar_receive,threadlidar_process;
    hSemaphnore1 = CreateSemaphore(NULL,1,1,NULL);
    hSemaphnore2 = CreateSemaphore(NULL,0,1,NULL);
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) Threadfun1, NULL, 0, &threadLidar_receive);
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) Threadfun2,NULL, 0, &threadlidar_process);
    Sleep(100);
    system("pause");
    return 0;
}

时间: 2024-10-08 20:27:15

信号量多线程同步的相关文章

【多线程】使用信号量进行同步【转】

本文转载自:http://blog.csdn.net/yusiguyuan/article/details/14110437  信号量是最早出现的用来解决进程同步与互斥问题的机制(也可实现进程通信),包括一个称为信号量的变量及对它进行的两个原语操作.信号量为一个整数,我们设这个信号量为:sem.很显然,我们规定在sem大于等于零的时候代表可供并发进程使用的资源实体数,sem小于零的时候,表示正在等待使用临界区的进程的个数.根据这个原则,在给信号量附初值的时候,我们显然就要设初值大于零. p操作和

细说.NET中的多线程 (五 使用信号量进行同步)

上一节主要介绍了使用锁进行同步,本节主要介绍使用信号量进行同步 使用EventWaitHandle信号量进行同步 EventWaitHandle主要用于实现信号灯机制.信号灯主要用于通知等待的线程.主要有两种实现:AutoResetEvent和ManualResetEvent. AutoResetEvent AutoResetEvent从字面上理解是一个自动重置的时间.举个例子,假设有很多人等在门外,AutoResetEvent更像一个十字旋转门,每一次只允许一个人进入,进入之后门仍然是关闭状态

一个经典的多线程同步问题

上一篇<秒杀多线程第三篇原子操作 Interlocked系列函数>中介绍了原子操作在多进程中的作用,现在来个复杂点的.这个问题涉及到线程的同步和互斥,是一道非常有代表性的多线程同步问题,如果能将这个问题搞清楚,那么对多线程同步也就打下了良好的基础. 程序描述: 主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程.子线程接收参数 -> sleep(50) -> 全局变量++ -> sleep(0) -> 输出参数和全局变量. 要求: 1.子线程输出的线

嵌入式 Linux进程间通信(十二)——多线程同步

嵌入式 Linux进程间通信(十二)--多线程同步 多线程编程中有三种线程同步机制:互斥锁.信号量.条件量.本文将使用生产者消费者问题编程实践三种线程同步方式. 生产者.消费者问题:生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费.消费者线程从缓冲区中获得物品,然后释放缓冲区.当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来. 一.互斥锁

[一个经典的多线程同步问题]总结

针对一个经典的线程同步互斥问题,前面几篇文章提出了四种解决方案:关键段.事件.互斥量.信号量. 下面对这四种解决方案做一个总结,梳理一下知识点: 首先来看下关于线程同步互斥的概念性的知识,相信大家通过前面的文章,已经对线程同步互斥有一定的认识了,也能模糊的说出线程同步互斥的各种概念性知识,下面再列出从<计算机操作系统>一书中选取的一些关于线程同步互斥的描述.相信先有个初步而模糊的印象再看下权威的定义,应该会记忆的特别深刻. 1.线程(进程)同步的主要任务 答:在引入多线程后,由于线程执行的异步

秒杀多线程第四篇 一个经典的多线程同步问题

上一篇<秒杀多线程第三篇原子操作 Interlocked系列函数>中介绍了原子操作在多进程中的作用,如今来个复杂点的.这个问题涉及到线程的同步和相互排斥,是一道很有代表性的多线程同步问题,假设能将这个问题搞清楚,那么对多线程同步也就打下了良好的基础. 程序描写叙述: 主线程启动10个子线程并将表示子线程序号的变量地址作为參数传递给子线程.子线程接收參数 -> sleep(50) -> 全局变量++ -> sleep(0) -> 输出參数和全局变量. 要求: 1.子线程输

多线程同步精要

单机并发编程有两种基本模型:"消息传递"和"共享内存":分布式系统运行在多台机器上,只有一种实用模型:"消息传递". 单机上多进程并发可以照搬"消息传递",多线程编程用"消息传递"更容易保证程序的正确性. 多线程同步有很多种方式:互斥量.条件变量.信号量.读写锁等.尽量不要用信号量和读写锁 Don't use a semaphore where a mutex would suffice. A semaph

Qt 多线程同步 与 通信

转自网络 1 多线程同步 Qt提供了以下几个类来完成这一点:QMutex.QMutexLocker.QSemphore.QWaitCondition. 当然可能还包含QReadWriteLocker.QReadLocker.QWriteLocker,但线程同步是应用很少,这里只做简单的讲解! QMutex.QMutexLocker QMutex类提供了一个保护一段临界区代码的方法,他每次只允许一个线程访问这段临界区代码.QMutex::lock()函数用来锁住互斥量,如果互斥量处于解锁状态,当前

windows多线程同步

概述 任何单个应用程序都不能完全使该处理器达到满负荷.当一个线程遇到较长等待时间事件时,同步多线程还允许另一线程中的指令使用所有执行单元.例如,当一个线程发生高速缓存不命中,另一个线程可以继续执行.同步多线程是 POWER5? 和 POWER6? 处理器的功能,可与共享处理器配合使用. SMT 对于商业事务处理负载的性能优化可达30%.在更加注重系统的整体吞吐量而非单独线程的吞吐量时,SMT 是一个很好地选择. 但是并非所有的应用都能通过SMT 取得性能优化.那些性能受到执行单元限制的应用,或者