Boost 推进线程

Boost 推进线程,boost,Boost,我需要一个增强线程来报告成功或失败。我目前正在通过传递一个指向bool的指针来实现这一点。它大部分时间都可以工作,但偶尔会抛出访问冲突错误 在传递指针以返回线程函数的成功或失败时,有什么错误吗?还有别的办法吗 溴 Niladri我们无法告诉您代码有什么问题,因为您没有发布任何代码,但是如果您传入指向线程函数的指针并将线程分配给它,您需要确保内存在整个线程期间保持有效。我们无法告诉您代码有什么问题,因为您没有发布任何代码,但是如果您传入指向线程函数的指针并将线程分配给它,您需要确保内存在整个线程期

我需要一个增强线程来报告成功或失败。我目前正在通过传递一个指向bool的指针来实现这一点。它大部分时间都可以工作,但偶尔会抛出访问冲突错误

在传递指针以返回线程函数的成功或失败时,有什么错误吗?还有别的办法吗


Niladri

我们无法告诉您代码有什么问题,因为您没有发布任何代码,但是如果您传入指向线程函数的指针并将线程分配给它,您需要确保内存在整个线程期间保持有效。

我们无法告诉您代码有什么问题,因为您没有发布任何代码,但是如果您传入指向线程函数的指针并将线程分配给它,您需要确保内存在整个线程期间保持有效。

您可能可以使用。您可以将未来视为线程之间的共享价值。一个线程将写入未来的值,另一个线程将读取它。如果未来尚未写入,则读取线程将阻塞,直到写入。Futures已经是boost.threads的一部分。

您可以使用。您可以将未来视为线程之间的共享价值。一个线程将写入未来的值,另一个线程将读取它。如果未来尚未写入,则读取线程将阻塞,直到写入。Futures已经是boost.threads的一部分。

最简单的是,您可能只需要将布尔值封装在一个类/结构中,并使用互斥锁保护对它的访问,但我不确定两个线程同时尝试读取和写入它会导致访问冲突:

struct saferBool
{
void setSuccessState ( bool b );
bool wasSuccessful ();
private:
bool successState;
boost::interprocess::interprocess_mutex mutex;
};

void saferBool::setSuccessState ( bool b )
{
mutex.lock();
successState = b;
mutex.unlock();
}

bool saferBool::wasSuccess ()
{
bool b;
mutex.lock();
b = successState;
mutex.unlock();
return b;
}

否则,可能是您无意中更改了指向的地址,或者您指向的布尔值在其本机线程中留下了作用域,使其地址对于第二个线程的写入无效。

最简单的是,您可能只需要将布尔值封装在类/结构中,并使用互斥锁保护对它的访问,但我不确定访问冲突是否来自两个试图同时读写它的线程:

struct saferBool
{
void setSuccessState ( bool b );
bool wasSuccessful ();
private:
bool successState;
boost::interprocess::interprocess_mutex mutex;
};

void saferBool::setSuccessState ( bool b )
{
mutex.lock();
successState = b;
mutex.unlock();
}

bool saferBool::wasSuccess ()
{
bool b;
mutex.lock();
b = successState;
mutex.unlock();
return b;
}

否则,可能是您无意中更改了指向的地址,或者您指向的布尔值在其本机线程中留下了作用域,使其地址对于第二个线程的写入无效。

谢谢,这看起来是解决方案。但剩下的问题是,我能否将指向boost线程的指针作为参数传递并安全地操作它。假设该指针或它指向的参数没有访问冲突?是的,只要它指向的内容在线程需要访问它的整个时间内都有效。谢谢,这看起来是解决方案。但剩下的问题是,我能否将指向boost线程的指针作为参数传递并安全地操作它。假设该指针或它所指向的参数没有访问冲突?是的,只要它指向的内容在线程需要访问它的整个时间内都有效。