Передающие структуры как аргументы при использовании pthread_create ()

Обратите внимание, что CSS используется в HTML, почему бы вам не попробовать использовать Bootstrap? Это действительно полезно, оно может изменить размер и переместить ваш элемент должным образом при изменении размера окна. И это делает это ответно. Вы можете использовать его классы (как), чтобы сделать это. Здесь смотрите документацию сетки макетов, она должна работать для вашей проблемы

https://getbootstrap.com/docs/4.3/layout/grid/

17
задан Jonathan Leffler 14 May 2009 в 16:30
поделиться

6 ответов

You're probably creating the structure in the same scope as pthread_create. This structure will no longer be valid once that scope is exited.

Try creating a pointer to the structure on the heap and pass that structure pointer to your thread. Don't forget to delete that memory somewhere (in the thread if you'll never use it again - or when you no longer need it).

Also, as cyberconte mentioned, if you are going to be accessing that data from different threads, you'll need to lock access to it with a mutex or critical section.

Edit May 14th, 2009 @ 12:19 PM EST: Also, as other people have mentioned, you have to cast your parameter to the correct type.

If you are passing a variable that is a global structure (which you seem to be insisting upon), your thread function will have to cast to the type:

void my_thread_func(void* arg){
    my_struct foo = *((my_struct*)(arg)); /* Cast the void* to our struct type */
    /* Access foo.a, foo.b, foo.c, etc. here */
}

Or, if you are passing a pointer to your structure:

void my_thread_func(void* arg){
    my_struct* foo = (my_struct*)arg; /* Cast the void* to our struct type */
    /* Access foo->a, foo->b, foo->c, etc. here */
}
24
ответ дан 30 November 2019 в 12:58
поделиться

Если вы находитесь внутри функции потока, передаваемый аргумент является пустым *. Вам нужно будет преобразовать его в структуру, прежде чем вы сможете использовать его как таковую.

void my_thread_func(void* arg){
    my_struct foo = (my_struct)(*arg); /* Cast the void* to our struct type */
    /* Access foo.a, foo.b, foo.c, etc. here */
}
2
ответ дан 30 November 2019 в 12:58
поделиться

Это сообщение об ошибке означает, что вы не разыменовываете указатель.

Вы говорите «та» вместо "t-> a"

[me@myhost ~]$ cat testitx.c
struct x {
        int a, b;
};

int main(int argc, char *argv[])
{
        struct x y, *z;

        z = &y;
        z.a = 10;
}
[me@myhost ~]$ cc -c testitx.c
testitx.c: In function `main':
testitx.c:10: error: request for member `a' in something not a structure or union
[me@myhost ~]$
0
ответ дан 30 November 2019 в 12:58
поделиться

I often used to make the same mistakes listed in the other answers, but now I take a slightly different approach that moves the potential for error from the threading function to the pthread_create call.

I declare and define the threading function in a 'normal' way:

void *ThreadFunction(sPARAMETERS *Params) {

  // do my threading stuff...

}

and when I call pthread_create, I need to use a cast:

pthread_create(&ThreadId,0,(void*(*)(void*)) &ThreadFunction,&Params);

I almost never forget to use the & on the Params, and the compiler will take care of any mistakes I make on the other end. Works great for callbacks, too.

0
ответ дан 30 November 2019 в 12:58
поделиться

Вы можете использовать разделяемую память или глобальную переменную (если этот аргумент больше не нужен) или связанный список, если это потоки, которые питаются данными.

Просто не забудьте заблокировать ваши переменные, которые совместно используются потоками.

Однако без фактического оскорбительного кода я не могу сказать вам, что вы делаете неправильно в своей текущей реализации.

0
ответ дан 30 November 2019 в 12:58
поделиться

Я думаю, что ответ Sharptooth точен. В разделе 12.3.4 стандарта C ++ (SC22-N-4411.pdf), озаглавленном «Преобразования», четко указано, что разрешено только одно неявное определяемое пользователем преобразование.

1 Преобразования типов объектов класса могут быть указаны с помощью конструкторы и преобразованием функции. Эти преобразования называются пользовательскими преобразованиями и используются для неявных преобразований типов (пункт 4), для инициализация (8.5), а для явных преобразований типов (5.4, 5.2.9).

2 Пользовательские преобразования применяются только там, где они однозначно (10.2, 12.3.2). Преобразования подчиняются правила контроля доступа (п.11). Контроль доступа применяется после разрешение неоднозначности (3.4).

3 [Примечание: См. 13.3 для обсуждения использования преобразований в вызовах функций, а также в примерах ниже. -конец note]

4 Максимум одно определяемое пользователем преобразование (конструктор или преобразование функция) неявно применяется к не замужем закрыть семафор

1
ответ дан 30 November 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: