一个经典的多线程同步问题
本篇文章参考了http://blog.csdn.net/morewindows/article/details/7442333
程序描述:
主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 -> sleep(50) -> 全局变量++ -> sleep(0) -> 输出参数和全局变量。
要求:
1.子线程输出的线程序号不能重复。
2.全局变量的输出必须递增。
下面画了个简单的示意图:
分析下这个问题的考察点,主要考察点有二个:
1.主线程创建子线程并传入一个指向变量地址的指针作参数,由于线程启动须要花费一定的时间,所以在子线程根据这个指针访问并保存数据前,主线程应等待子线程保存完毕后才能改动该参数并启动下一个线程。这涉及到主线程与子线程之间的同步。
2.子线程之间会互斥的改动和输出全局变量。要求全局变量的输出必须递增。这涉及到各子线程间的互斥。
下面列出这个程序的基本框架,可以在此代码基础上进行修改和验证。
//经典线程同步互斥问题 #include <stdio.h> #include <process.h> #include <windows.h>long g_nNum; //全局资源 unsigned int __stdcall Fun(void *pPM); //线程函数 const int THREAD_NUM = 10; //子线程个数int main() {g_nNum = 0;HANDLE handle[THREAD_NUM];int i = 0;while (i < THREAD_NUM) {handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL);i++;//等子线程接收到参数时主线程可能改变了这个i的值}//保证子线程已全部运行结束WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE); return 0; }unsigned int __stdcall Fun(void *pPM) { //由于创建线程是要一定的开销的,所以新线程并不能第一时间执行到这来int nThreadNum = *(int *)pPM; //子线程获取参数Sleep(50);//some work should to dog_nNum++; //处理全局资源Sleep(0);//some work should to doprintf("线程编号为%d 全局资源值为%d\n", nThreadNum, g_nNum);return 0; }
运行结果可以参考下列图示,
可以看出,运行结果完全是混乱和不可预知的。本系列将会运用Windows平台下各种手段包括关键段,事件,互斥量,信号量等等来解决这个问题并作一份全面的总结,敬请关注。
一个经典的多线程同步问题相关推荐
- [一个经典的多线程同步问题]解决方案一:关键段CS
前面提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题. 本文先介绍如何使用关键段,然后再深层次的分析下关键段的实现机制和原理. 关键段CRITICA ...
- [一个经典的多线程同步问题]解决方案三:互斥量Mutex
本篇通过互斥量来解决线程的同步,学习其中的一些知识. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互 ...
- 秒杀多线程第十二篇 多线程同步内功心法——PV操作上
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- windows多线程同步--临界区
推荐参考博客:秒杀多线程第五篇 经典线程同步 关键段CS 关于临界区的观念,一般操作系统书上面都有. 适用范围:它只能同步一个进程中的线程,不能跨进程同步.一般用它来做单个进程内的代码快同步,效率比较 ...
- 多线程面试题系列(12):多线程同步内功心法——PV操作上
上面的文章讲解了在Windows系统下实现多线程同步互斥的方法,为了提高在实际问题中分析和思考多个线程之间同步互斥问题的能力,接下来将讲解PV操作,这也是操作系统中的重点和难点.本文将会先简要介绍下P ...
- java里的多线程同步机制
2019独角兽企业重金招聘Python工程师标准>>> 要说明线程同步问题首先要说明Java线程的两个特性,可见性和有序性.多个线程之间是不能直接传递数据交互的,它们之间的交互只能通 ...
- 关于多线程同步与互斥
原文:看我稳住「多线程」翻车的现场!_小林coding-CSDN博客 文章目录 前言 正文 竞争与协作 互斥的概念 同步的概念 互斥与同步的实现和使用 锁 信号量 生产者-消费者问题(互斥+同步) 经 ...
- python多线程读取文件的问题_Python多线程同步---文件读写控制方法
1.实现文件读写的文件ltz_schedule_times.py #! /usr/bin/env python #coding=utf-8 import os def ReadTimes(): res ...
- 【转】windows平台多线程同步之Mutex的应用
线程组成: 线程的内核对象,操作系统用来管理该线程的数据结构. 线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量. 操作系统为每一个运行线程安排一定的CPU时间 -- 时间片.系统通过 ...
最新文章
- spring cloud 集成consul
- MyBatis缓存分为一级缓存和二级缓存
- ubuntu的home目录下,Desktop等目录消失不见
- 速度一半永远追不上_您将永远不会知道自己应该怎么做的一半-没关系。
- springboot aop使用_SpringBoot 使用AOP实现读写分离
- notepad++ 中增加lua语法检查快捷键
- POJ 3668 枚举?
- php 设置空数组,声明空数组,填充和迭代问题-php
- Jave_erhui
- 计算机连接打印机没有dot4,Windows无法连接到打印机错误消息0x00000214
- 知识分享!电阻按照用途分类可以分为哪几种电阻?-道合顺大数据infinigo
- 安卓手机各大应用市场APP审核遇到的坑
- 有无孔孟之道,太阳照常升起
- Caché——高性能对象关系型数据库
- 1982年版《茶馆》内容简要回顾
- 5G的NSA和SA,到底啥意思?
- 天弘基金移动App客户端架构优化之路
- SQL相关的时间日期类型
- kubernetes部署Elasticsearch cluster Kibana Cerebro
- mysql 1114 hy000_mysql 解决 ERROR 1114 (HY000): The table 'XXX' is full
热门文章
- Python中出现“TabError: inconsistent use of tabs and spaces in indentation”
- 连接redis的方法
- Linux下将pycharm图标添加至桌面
- SinoBBD亮相全球云计算大会 彰显一体化云力量
- Heartbeat(v1、v2、pacemaker)集群组件概述
- HTML5通信机制与html5地理信息定位(gps)
- 搭建局域网HTTP FTP服务
- VCC、VDD、VEE、VSS的区别
- vs2008 sp1补丁安装到最后一点点的时候,就无法安装下去了 解决方法
- HDU - 6464 免费送气球(线段树二分)