相关疑难解决方法(0)

相互排斥和信号量

我正在写一个模拟男女皆宜的浴室的程序(用于家庭作业).一次只允许4个人,如果其他性别已经在使用浴室,男女不能进入.我的问题是允许最多4人在浴室.从输出中可以看出,一次只有一个人进入洗手间.这是我的代码:

const int Delayx = 60;
int i;
int restroom = 0;
int Menwaiting = 0;
int Womenwaiting = 0;
semaphore max_capacity;
semaphore woman;
semaphore man;
semaphore mutex;
semaphore restroomcount;
void Delay(void)
{
    int DelayTime;
    DelayTime = random(Delayx);
    for (i = 0; i<DelayTime; i++);
}

void Woman(void)
{
//  for(;;){
    Womenwaiting++;
    //wait(mutex);
    wait(woman);
    wait(max_capacity);
        //wait(woman);
        wait(mutex);
        wait(restroomcount);
        cout << "A Woman has entered Restroom"<<endl;
        cout << "People in the Restroom:" << restroom++ <<endl <<endl;
        signal(restroomcount);
        Womenwaiting--;
        Delay();
        wait(restroomcount);
        cout << …
Run Code Online (Sandbox Code Playgroud)

c++ mutex semaphore

11
推荐指数
1
解决办法
9350
查看次数

这段代码是线程安全的吗?

这是我正在维护的一些代码的简化版本:

int SomeFunc() 
{
  const long lIndex = m_lCurrentIndex;
  int nSum = 0;
  nSum += m_someArray[lIndex];
  nSum += m_someArray[lIndex];
  return nSum;
}
Run Code Online (Sandbox Code Playgroud)

lCurrentIndex由另一个线程定期更新.问题是; 将制作m_CurrentIndex的本地副本确保对m_someArray的两次访问都使用相同的索引?

请注意,这是一个简化的例子; 我正在考虑制作本地副本的概念,而不是这里显示的确切代码段.我知道编译器会将值放在寄存器中,但这仍然是本地副本,而不是从lCurrentIndex读取两次.

谢谢!

编辑:初始分配是安全的,在我们的设置中保证两者都是32位.Edit2:它们在32位边界上正确对齐(忘了那个)

c++ thread-safety lock-free

3
推荐指数
2
解决办法
451
查看次数

我的多线程程序运行缓慢或在双核机器上出现死锁,请帮忙

我有一个包含多个线程的程序,一个线程将在退出时更改全局,另一个线程将重复轮询全局.对全局变量没有任何保护.该程序在单处理器上运行良好.在双核机器上,它会工作一段时间,然后在Sleep(0)或SuspendThread()上停止.有人能帮我解决这个问题吗?

代码如下:

Thread 1:

do something...
while(1)
{
.....
flag_thread1_running=false;
SuspendThread(GetCurrentThread());
continue;

}

Thread 2
flag_thread1_running=true;
ResumeThread(thread1);
.....do some other work here....
while(flag_thread1_running) Sleep(0);
....
Run Code Online (Sandbox Code Playgroud)

c c++ winapi multithreading

2
推荐指数
1
解决办法
1191
查看次数

标签 统计

c++ ×3

c ×1

lock-free ×1

multithreading ×1

mutex ×1

semaphore ×1

thread-safety ×1

winapi ×1