多线程数组的读写同步

hhhh63 2020-03-18 10:10:34
需求描述:多个线程,每个线程有一个可变长度和内容的数组。每个线程会对所有线程的数组进行读操作,分析数据。每个线程进行数据采集,修改自己的数组的内容和长度。
问题:1、所有线程可以同时读每个线程的数组;
2、正在读数组时不能写这个线程的数组;
3、正在写数组时不能读这个线程的数组;
求高手指点规范的思路,谢谢!
...全文
543 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhhh63 2020-04-01
  • 打赏
  • 举报
回复
搞不太懂,我自己写了一个类,经过多次试验,基本可用,谢谢各位。
xdayong 2020-03-27
  • 打赏
  • 举报
回复
引用 8 楼 hhhh63 的回复:
[quote=引用 7 楼 xsc2001 的回复:] 那就是仓库是大池子,他是一个动态变化的数组,而你的每个小车是消费者,每次都应该一次取一个或者N个,取到以后是一次性卸货还是分多次?
各走各的,路线有交叉,任务可能有重叠。[/quote] 我的理解: 1.如7楼所说,仓库是个大线程池 2.小车每次都到里面取一组线程来运行,仓库可以考虑把这些线程删除 3.小车运行结束后,根据需要交任务(成功),或者是重新入库(失败)。 我觉得,只用在仓库数据读取的时候,加个锁(临界区)就可以了
xsc2001 2020-03-22
  • 打赏
  • 举报
回复
从你的第一条需求上分析,你没有必要每个线程都设置一个数组,统一用一个数据数组就可以了。
1、所有线程可以同时读每个线程的数组;
无论是读取数组数据还是修改、增加数据都加上锁即可,这样逻辑比较简单而且简单,用EnterCriticalSection和LeaveCriticalSection即可。
hhhh63 2020-03-22
  • 打赏
  • 举报
回复
引用 7 楼 xsc2001 的回复:
那就是仓库是大池子,他是一个动态变化的数组,而你的每个小车是消费者,每次都应该一次取一个或者N个,取到以后是一次性卸货还是分多次?

各走各的,路线有交叉,任务可能有重叠。
xsc2001 2020-03-22
  • 打赏
  • 举报
回复
引用 6 楼 hhhh63 的回复:
[quote=引用 5 楼 xsc2001 的回复:]
从你的第一条需求上分析,你没有必要每个线程都设置一个数组,统一用一个数据数组就可以了。
1、所有线程可以同时读每个线程的数组;
无论是读取数组数据还是修改、增加数据都加上锁即可,这样逻辑比较简单而且简单,用EnterCriticalSection和LeaveCriticalSection即可。

多谢回复,我的需求没有写清楚,实际是一个仓库自动搬运系统,很多搬运小车,每个小车一个线程,指挥程序根据这些小车的数据进行任务调度,路径规划等等。望继续指点。[/quote]
那就是仓库是大池子,他是一个动态变化的数组,而你的每个小车是消费者,每次都应该一次取一个或者N个,取到以后是一次性卸货还是分多次?
hhhh63 2020-03-22
  • 打赏
  • 举报
回复
引用 5 楼 xsc2001 的回复:
从你的第一条需求上分析,你没有必要每个线程都设置一个数组,统一用一个数据数组就可以了。
1、所有线程可以同时读每个线程的数组;
无论是读取数组数据还是修改、增加数据都加上锁即可,这样逻辑比较简单而且简单,用EnterCriticalSection和LeaveCriticalSection即可。

多谢回复,我的需求没有写清楚,实际是一个仓库自动搬运系统,很多搬运小车,每个小车一个线程,指挥程序根据这些小车的数据进行任务调度,路径规划等等。望继续指点。
hhhh63 2020-03-20
  • 打赏
  • 举报
回复
下面的程序发不了了,说有非法词组,又不告诉我那个非法。!!!!!!
hhhh63 2020-03-20
  • 打赏
  • 举报
回复
自己写了两个类,HMutex 和 HLock,一个是互斥类,一个是锁定类,锁定类的目的是自动解锁,避免忘记解锁。
/// <类型>class</类型>
/// <作者>Mr. Hu</作者>
/// <日期>20200317</日期>
/// <名称>锁定类</名称>
/// <说明>与HLock配合使用,目的是在失效时自动解锁,防止程序从中间退出而没有解锁。
/// </说明>
class HMutex
{
// Construction
public:
/// <类型>Fanction</类型>
/// <作者>Mr. Hu</作者>
/// <日期>20200317</日期>
/// <功能>构造函数</功能>
/// <参数 name = ""></参数>
/// <返回></返回>
/// <说明>m_nCount = 0时允许读写,读操作时>0,计数+1,结束时减1。写数据时<0,计数-1
/// >=0时,可以多线程同时读取,<0时只有指定线程可以读写。
/// </说明>
HMutex()
: m_nCount(0)
, m_nThread(0)
{
}

// Properties
public:
int m_nCount; // 使用次数,为0时没有使用,<0表示写锁定,>0表示正在读取数据。
DWORD m_nThread; // 写数据锁定的线程,为0时没有锁定

protected:

// Methods
public:

// Overwrite
public:

// Messages
public:

};

hhhh63 2020-03-19
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
window下线程同步之(Semaphores(信号量))

看了,不太懂,能不能根据我的需求具体描述一下,谢谢

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧