多线程-线程同步

  • CreateThread函数与_beginthreadex 函数的联合使用:
    • 为了多线程同步的需要,使每个线程必须具有唯一的状态,CreateThread还不能灵活使用,需要使用C/C++运行期库;
    • CreateThread函数参数与_beginthreadex函数对应的,只是类型不同,需要强制转换。
  • 每个线程都有自己的内核对象,包含了该线程的属性信息;

#include<windows.h>
#include<iostream>
#include<process.h>
using namespace std;

UINT __stdcall ThreadProcess(LPVOID lpParam);
int b = true;
int count1 = 0;
int count2 = 0;

int main()
{
    UINT Ui;
    HANDLE hThread[10];
    for (int i = 0; i < 10; i++)
    {
        hThread[i] = (HANDLE)::_beginthreadex(NULL, 0, ThreadProcess, NULL, 0, &Ui);
    }
    Sleep(6000);

    b = false;

    ::WaitForMultipleObjects(10, hThread, TRUE, INFINITE);

    for (int i = 0; i < 10; i++)
    {
        ::CloseHandle(hThread[i]);
    }

    cout << "Count1=" << count1 << endl;
    cout << "Count2=" << count2 << endl;

    return 0;
}

UINT __stdcall ThreadProcess(LPVOID lpParam)
{
    while (b)
    {
        count1++;
        count2++;
    }
    return 0;
}

Count1=114786278
Count2=51099437
请按任意键继续. . .

  • 同步上述count1与count2不同:临界区对象,能很好保护共享数据,但不能由于进程间锁定资源,它不是内核对象。
    • 使用临界区对象:是定义在数据段中的一个CRITICAL_SECTION结构,确保在同一时间只有一个线程访问该数据段中的数据。
    • 把临界区数据定义在保护数据段中,void InitializeCriticalSection(LPCRITICAL_SECTION lp_cs);指向数据段中的CRITICAL_SECTION结构;
    • 申请访问数据段数据,void EnterCriticalSection(LPCRITICAL_SECTION lp_cs);
    • 数据段区使用完毕,返还;void LeaveCriticalSection(LPCRITICAL_SECTION lp_cs);
    • 程序不再使用临界区数据时,删除;void DeleteCriticalSection(LPCRITICAL_SECTION lp_cs);


#include<windows.h>
#include<iostream>
#include<process.h>
using namespace std;

UINT __stdcall ThreadProcess(LPVOID lpParam);
int b = true;
int count1 = 0;
int count2 = 0;
CRITICAL_SECTION cs;
int main()
{
    UINT Ui;
    HANDLE hThread[10];

    ::InitializeCriticalSection(&cs);
    for (int i = 0; i < 10; i++)
    {
        hThread[i] = (HANDLE)::_beginthreadex(NULL, 0, ThreadProcess, NULL, 0, &Ui);
    }
    Sleep(6000);

    b = false;

    ::WaitForMultipleObjects(10, hThread, TRUE, INFINITE);

    for (int i = 0; i < 10; i++)
    {
        ::CloseHandle(hThread[i]);
    }
    ::DeleteCriticalSection(&cs);
    cout << "Count1=" << count1 << endl;
    cout << "Count2=" << count2 << endl;

    return 0;
}

UINT __stdcall ThreadProcess(LPVOID lpParam)
{
    while (b)
    {
        ::EnterCriticalSection(&cs);
        count1++;
        count2++;
        ::LeaveCriticalSection(&cs);
    }
    return 0;
}
 

Count1=19105856
Count2=19105856
请按任意键继续. . .

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最强原创综述!当强化学习邂逅组合优化

『运筹OR帷幄』转载来源&#xff1a;运筹OR帷幄作者&#xff1a;黄含驰未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云脑研究计划&#xff0c;构建互联网&…

7-2 银行排队问题之单窗口“夹塞”版 (30 分)

PTA 排队“夹塞”是引起大家强烈不满的行为&#xff0c;但是这种现象时常存在。在银行的单窗口排队问题中&#xff0c;假设银行只有1个窗口提供服务&#xff0c;所有顾客按到达时间排成一条长龙。当窗口空闲时&#xff0c;下一位顾客即去该窗口处理事务。此时如果已知第i位顾客…

数学认知中的具身进路及其哲学观初探

来源&#xff1a;《科学技术哲学研究》2020年第6期作者&#xff1a;王东&#xff08;北京工商大学马克思主义学院&#xff09;吴彤&#xff08;清华大学人文学院&#xff09;国家社会科学基金重大课题“科学实践哲学与地方性知识研究”(13&ZD068)从数学思想史以及数学哲学的…

Flink编程入门(二)

Flink 有三种部署模式&#xff0c;分别是 Local、Standalone Cluster 和 Yarn Cluster。 1.1. Local模式 对于 Local 模式来说&#xff0c;JobManager 和 TaskManager 会公用一个 JVM 来完成 Workload。如果要验证一个简单的应用&#xff0c;Local 模式是最方便的。实际应用中大…

7-4 银行排队问题之单队列多窗口加VIP服务 (30 分)

7-4 银行排队问题之单队列多窗口加VIP服务 (30 分) 说实话这道题挺恶心 有意思的&#xff0c;大模拟&#xff0c;主要的思路就是模拟时间轴。 题目描述 假设银行有K个窗口提供服务&#xff0c;窗口前设一条黄线&#xff0c;所有顾客按到达时间在黄线后排成一条长龙。当有窗口…

线程同步-互锁函数

互锁函数&#xff1a; LONG InterlockedIncrement&#xff08;LONG volatile* Addend&#xff09;&#xff1a;递增指定32位变量&#xff0c;增量位1&#xff0c;可以阻止其他线程同时使用此变量&#xff1b;LONG InterlockedDecrement&#xff08;LONG volatile* Addend&#…

李德毅院士:探索新一代人工智能产业发展

来源&#xff1a;主线科技2021年5月14日&#xff0c;主线科技联合中国人工智能学会智驾专委会正式发起成立“新一代人工智能物流创新中心”&#xff0c;并携手福佑卡车开启中国首个干线物流自动驾驶商业项目。在此次活动上&#xff0c;中国工程院院士、CAAI名誉理事长、主线科技…

1.修理牧场

农夫要修理牧场的一段栅栏&#xff0c;他测量了栅栏&#xff0c;发现需要N块木头&#xff0c;每块木头长度为整数L​i个长度单位&#xff0c;于是他购买了一条很长的、能锯成N块的木头&#xff0c;即该木头的长度是Li​​ 的总和。 但是农夫自己没有锯子&#xff0c;请人锯木的…

线程同步-事件内核对象

事件内核对象&#xff1a;两种状态&#xff0c;受信状态与未受信状态&#xff0c;3个成员&#xff1b; nUsageCount&#xff08;使用计数&#xff09;&#xff1b;bManualReset&#xff08;是否人工重置&#xff09;&#xff1b;bSignagled&#xff08;是否受信&#xff09;。基…

yii2.0AR两表联查

首先&#xff0c;建两个关联表。 表一 -- Table structure for article -- ---------------------------- DROP TABLE IF EXISTS article; CREATE TABLE article ( id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增id, new text, t_id int(11) DEFAULT NULL COMMENT 关联id, P…

AI产业链全景图!【物联网智商精选】

来源&#xff1a;ittbankAI产业链全景图最后给大家介绍一款英伟达高性能AI边缘计算超级计算机模块&#xff1a;NVIDIA JETSON TX2Jetson TX2是NIVDIA瞄准人工智能在Jetson TK1和TX1推出后的升级TX2的GPU和CPU都进行了升级&#xff0c;内存增加到了8GB、存储增加到了32GB&#…

7-2 哈夫曼编码 (30 分)

2019.12.15更正Best函数样本数据初始化问题并且对代码添加了注释; 2020.11.17更正&#xff1a;题目说明&#xff1b; 原贴发于2019.11.22 注意&#xff1a;本题不是哈夫曼编码裸题&#xff0c;学习哈夫曼编码的同学不要过度依赖本题算法&#xff0c;只有参考价值&#xff1b; 给…

通用AI咋发展?向大脑学习是条路子

来源&#xff1a;中国科学报作者&#xff1a;郑金武编辑&#xff1a;赵路排版&#xff1a;志海作为代表自然界拥有最通用智能的生物大脑&#xff0c;可以借助低功耗和少量后天数据&#xff0c;实现在复杂环境下执行复杂任务的智能行为。因此&#xff0c;探索生物大脑智能认知的…

Oracle:select into 查询没有记录的解决办法

在数据库编程中&#xff0c;select into 语句可以将数据库的某些值赋值给程序的变量&#xff0c;使用起来非常方便。但很多时候也会遇到查询出来没有记录的情况&#xff0c;这时程序会出错。 可以使用 exception when NO_DATA_FOUND then 但是如merge into using 查不到时可以使…

MFC随机博弈黑白棋

随机博弈黑白棋 随机博弈黑白棋 TxyITxs | 随机博弈黑白棋 | 2019.04.21 摘要 通过随机落子&#xff0c;实现黑白棋的博弈。无任何落子规则&#xff0c;棋子死活与围棋中棋子的死活一致&#xff0c;即存在至少一口气。动态模拟双方博弈&#xff0c;但棋盘无落子位置时停止。…

7-3 喊山 (30 分)

搞了好几天心态的一道题&#xff0c;还是菜&#xff0c;原因就是想复杂了&#xff0c;第一次遇到了内存超限的问题&#xff0c;把邻接矩阵由二维数组换成了vector才过的。 7-3 喊山 (30 分) 喊山&#xff0c;是人双手围在嘴边成喇叭状&#xff0c;对着远方高山发出“喂—喂喂…

章鱼有9个大脑能编辑基因,智商高到无法理解,为何没发展出文明

来源&#xff1a;科学杂志按照进化论的观点&#xff0c;生物演化出脊椎&#xff0c;是发展出更高智商的敲门砖。因为脊椎让生物体内的神经高度集中&#xff0c;反应速度明显加快&#xff0c;并且还有利于大脑向更加高级的结构演化。事实也确实如此&#xff0c;如果盘点世界上最…

Python运算符与编码

while循环 1.基本循环while 条件: 循环体如果条件为真&#xff0c;那么循环则执行如果条件为假&#xff0c;那么循环不执行 while循环代码体现形式while 3>2:print(在人间) num 1  while num<101:  print(num)  num num 1 break 终止  continue 跳出本次循环,…

Windows坐标系统

坐标映射方式是设备环境中的一个重要属性&#xff0c;默认值为MM_TEXT&#xff0c;即左上角为原点&#xff0c;右方为x轴正方向&#xff0c;下方为y轴正方向&#xff0c;这种坐标系使用的单位是像素&#xff0c;其好处是窗口中的每一点的坐标不会因为窗口大小而改变。 映射方法…

7-1 公路村村通 (30 分)

现有村落间道路的统计数据表中&#xff0c;列出了有可能建设成标准公路的若干条道路的成本&#xff0c;求使每个村落都有公路连通所需要的最低成本。 输入格式: 输入数据包括城镇数目正整数N&#xff08;≤1000&#xff09;和候选道路数目M&#xff08;≤3N&#xff09;&#…