Synchronization 同步2个posix线程

Synchronization 同步2个posix线程,synchronization,thread-safety,pthreads,Synchronization,Thread Safety,Pthreads,我有两个线程,它们都在删除最后两个线程指定的内存。我的问题是,可能一个线程在另一个线程启动之前启动并完成,因此它会删除另一个线程需要的内存。我如何同步它们以避免发生这种情况。 作为一种设计,我的线程如下所示: void* thread1(void* arg) { lock(&mutex); counter++; unlock(&mutex); // more code here lock(&mutex); counter--;

我有两个线程,它们都在删除最后两个线程指定的内存。我的问题是,可能一个线程在另一个线程启动之前启动并完成,因此它会删除另一个线程需要的内存。我如何同步它们以避免发生这种情况。
作为一种设计,我的线程如下所示:

void* thread1(void* arg)   
{
   lock(&mutex);
   counter++;
   unlock(&mutex);

   // more code here

   lock(&mutex);
   counter--;
   if(counter == 0)
   {  
      delete a;
      delete b;
    }
    unlock(&mutex);
}
另一个线程看起来相同,但这不是取消关闭以停止thread1以在thread2启动之前完成。

谢谢。

顺便说一句,这里的互斥使用得很好

您可以添加另一个受同一互斥锁保护的计数器,并且只对其执行增量操作。然后在退出代码中,您可以检查它以确认所有线程都已启动

i、 e.将其更改为“如果(计数器==0&&started==2)”

由于您使用互斥锁保护counter&started访问,如果1和2都在其中一个完成之前启动,那么第一个完成的将看到started=2和counter=1。另一个将看到started=2和counter=0,并删除资源


如果一个线程在其他线程启动之前运行到完成,它将看到started=1和counter=0。然后另一个线程将看到started=2和counter=0并进行清理。

顺便说一句,这里很好地使用了互斥

您可以添加另一个受同一互斥锁保护的计数器,并且只对其执行增量操作。然后在退出代码中,您可以检查它以确认所有线程都已启动

i、 e.将其更改为“如果(计数器==0&&started==2)”

由于您使用互斥锁保护counter&started访问,如果1和2都在其中一个完成之前启动,那么第一个完成的将看到started=2和counter=1。另一个将看到started=2和counter=0,并删除资源

如果一个线程在其他线程启动之前运行到完成,它将看到started=1和counter=0。然后另一个线程将看到started=2和counter=0并进行清理。

您不能只执行以下操作:

void *thread1(void* arg)
{
   // your code

   lock(&mutex);
   counter++;
   if (counter == 2) {
      // whatever
   }
   unlock(&mutex);
}
当然,假设在任一线程启动之前计数器被初始化为0。

您不能只执行以下操作:

void *thread1(void* arg)
{
   // your code

   lock(&mutex);
   counter++;
   if (counter == 2) {
      // whatever
   }
   unlock(&mutex);
}

当然,假设在任何一个线程启动之前计数器被初始化为0。

感谢您的回复,我只是测试一下计数器==2,更少的代码:)您的代码保证在任何一个线程启动之前创建资源,是吗?在这种情况下,执行计数器==2应该可以工作。感谢您的回复,我只是测试一下计数器==2,更少的代码:)您的代码保证在任一线程启动之前创建资源,是吗?在这种情况下,计数器==2应该可以工作。因此,如果第一个线程在第二个线程开始之前开始和结束,该怎么办?然后当第二个线程开始时,计数器==1,直到它使用互斥锁为止。当thread2获取互斥量时,
counter++
将其提升到2,thread2可以继续清理。那么,如果第一个线程在第二个线程开始之前开始并结束,该怎么办?然后当第二个线程开始时,
counter==1
,直到它获取互斥量为止。当thread2获得互斥锁时,
counter++
将其提升为2,thread2可以继续清理。