我有一个这个线程的计时器线程和函数,必须将参数size_t传递给函数。
void* global::timer_event::entry_point(void* n)
{
namespace N = global::utils;
struct timeval tv;
size_t* s = (size_t*)n;
N::set_timer(tv, *s);
while(1)
{
if (N::check_timer(tv, *s) == 1)
{
pthread_mutex_lock(&set_queue_mutex);
N::print_queue(q);
pthread_mutex_unlock(&set_queue_mutex);
}
}
}
void global::timer_event::run(size_t n)
{
pthread_create(&m_t, 0, &entry_point, (void*)n);
}
但该程序将在N::set_timer(tv, *s);
行崩溃
也就是说,当你使用* s时。如何很好地进行这种转换?
答案 0 :(得分:2)
你的第一个演员是来自 size_t
。
然后你将转换为 size_t*
。
这显然是错误的。
将其转回size_t
。
答案 1 :(得分:1)
pthread_create(&m_t, 0, &entry_point, (void*)n);
将n的值传递给threadFunc。 例如,如果n = 0(或其他值),则在这些语句中:
size_t* s = (size_t*)n;
N::set_timer(tv, *s);
*(s = 0)==>在地址==>处访问地址0x0(或其他受保护的内存)==>访问冲突碰撞~~ BOOM ~~
答案 2 :(得分:0)
创建线程时,按值传递变量n
,但在线程函数中将其用作指针。你需要在线程函数中将它作为而不是指针。