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可以继续清理。