Ошибка сегмента при попытке заменить swapcontext () на член структуры, который хранится в очереди

Я определил структуру под названием thread с членом под названием ucontext* tctx,

В функции под названием create_thread()Я создаю объект потока в куче и определяю каждого из его элементов (включая элементы объекта ucontext). Затем я добавляю указатель на этот объект потока в очередь-контейнер.

Когда я выталкиваю очередь, чтобы переключиться в контекст потока, я испытываю ошибку. Я не уверен, почему это происходит.

Вот полный код:

#include <iostream>
#include <queue>
#include <ucontext.h>

#define STACK_SIZE 262144

using namespace std;

typedef struct thread
{
int thread_id;
ucontext* tctx;
char* sp;
}thread;

int thread_id;
ucontext_t* ctx1; //Unused, currently
ucontext_t* cur;
queue<thread*> ready_queue;

/* Function Declaration */
thread* create_thread(int,int);
void foo1(int);int main(int argc, char** argv)
{
cout << " PROGRAM START ***** \n";

/* Create 'i' number of threads */
for(int i = 0; i < 2; i++)
{
cout << "\nready_queue size before creating thread = " << ready_queue.size() << endl;
cout << "Calling create thread ... id=" << i << endl;
create_thread(i, i*1000);
cout << "ready_queue size after creating thread = " << ready_queue.size() << endl;
}

cout << " \t>> THREADS CREATED \n";
cout << " \t>> SWITCHING CONTEXT \n";/* Save current context to cur, swap context to first thread in queue */
swapcontext(cur, ready_queue.front()->tctx); //Seg fault!

cout << " PROGRAM TERMI ***** \n";
return 0;
}thread* create_thread(int id, int arg)
{
static int num_threads = 0;

/* Create a new thread struct, ucontxt for the thread, and put in ready queue */
thread* n = new thread;
getcontext(n->tctx);
n -> thread_id = id;
n -> tctx = new ucontext_t;
n -> sp   = new char[STACK_SIZE];

n->tctx->uc_stack.ss_sp = n->sp;
n->tctx->uc_stack.ss_size = STACK_SIZE;
n->tctx->uc_stack.ss_flags = 0;
n->tctx->uc_link = NULL;
makecontext(n->tctx, (void(*)()) foo1, 1, arg); //Thread shall call foo() with argument 'arg'

/* Push new thread into ready_queue */
ready_queue.push(n);

num_threads++;
cout << "Thread #" << num_threads << " was created. Thread.ID[" << id << "]\n";

return n;
}//Application function
void foo1(int arg)
{
cout << "Calling from foo1(). I have " << arg << "!\n";
}

Отредактировано:

Я заметил, что если я позвоню getcontext(n->tctx); после n -> tctx = new ucontext_t; проблема устранена. Кажется, проблема в том, что getcontext пытался инициализировать что-то в куче, которая еще не была выделена.

0

Решение

ucontext_t* cur Указатель болтается, поэтому происходит сбой swapcontext. Вы можете выделить действительное значение (new ucontext_t), но лучше сделать его тип ucontext_t а не указатель. То же самое относится и к thread.tctx и нет необходимости держать thread.sp указатель тоже.

Тем не менее, C ++ 11 имеет std::thread это гораздо лучшая альтернатива тому, что вы пытаетесь сделать, и это будет правильный подход C ++. Также, если вы хотите узнать что-то новое, я бы рекомендовал вместо этого сосредоточиться на std :: thread. Здесь есть хороший урок: https://solarianprogrammer.com/2011/12/16/cpp-11-thread-tutorial/

Кстати, в вашем примере getcontext(n->tctx); также вызывается на неинициализированный tctx и у вас много несвободной памяти в конце вашей программы …

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]