线程读写同步的讨论,或者是求解吧。

千梦一生 2019-10-14 05:15:08
今天遇到一段两个线程并行一读一写的代码。有点疑惑,感觉自己太菜,向与大家讨论一下,或者向大家学习请教一下。先写写各位了
基本就是如下(伪代码):
那段代码运行起来,确实似乎没有发现有什么问题。
我比较担忧的一点是:我感觉这两个变量(我们希望)有着一个关系:arr的元素个数恒等于count的值。
但是我发现它的代码对这两个变量的同时地改变的时候,包括后来地判断哪些,并没有处在同一个临界区中(不像原子操作)。
我绞尽脑汁,这代码看起来简单,但变成多线程比较随机地调度之后,就感觉有点脑胀,强行举了几个例子也没发现什么问题。
首先请问一下:这样写有没有bug?
其次:这样写是否会有风险?如果有,是怎样一种风险
另外:如果是n读n写地情况下,这样的arr和count不进行原子操作绑定起来,是否有bug,有风险?

class A
{
Array arr[];//设所有操作为原子操作
int count;//设所有操作为原子操作

push(item)//线程A写入
{
arr.push(item);//写入
count++;//计数++
if(count==0)//如果队列中仅此一个资源
{
awake();//唤醒B继续来读
}
}

item pop()//线程B读取
{
count--;//计数--
if(count<0)//如果队列中目前没有资源
{
if(wait(100ms))//阻塞自己等待A唤醒或超时
{
arr.pop();//读取
}else
{
count++;
}
}else
{
arr.pop();//读取
}
}
}
...全文
27 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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