LINUX.ORG.RU

va_list и поток.


0

0

То ли лыжи не едут, то ли...

есть abc(a,b,...)

в коде этой функции я получаю va_list. тут же в этой функции я создаю поток... как этот va_list передать потоку?

пробовал засунуть в структуру путем va_copy - не получается :(

где я ошибаюсь? может пример кто даст посмотреть? везде где есть пример использования va_list - везде прямая работа с ним (включая последующую передачу в вызовы). но у меня малость другая ситуация... мне надо в поток завернуть сей список параметров.

Deleted

что-то меня тут осенило... для потока ведь создается собственный стек, а все манипуляции с va_* это манипуляции со стеком текущего процесса (в линуксе ведь поток это отдельный процесс, за исключением того, что он имеет то же адресное пространство с тем, кто создал этот поток). собственно и получается, что сие не прокатит.

единственный вариант, это "распарсить" va_list, засунуть в какой-нибудь список (а-ля GList) и передать потоку.

Может кто прокомментирует мои доводы? может я где-нибудь ошибаюсь?

Deleted
()
Ответ на: комментарий от Deleted

> что-то меня тут осенило... для потока ведь создается собственный стек, а все манипуляции с va_* это манипуляции со стеком текущего процесса (в линуксе ведь поток это отдельный процесс, за исключением того, что он имеет то же адресное пространство с тем, кто создал этот поток). собственно и получается, что сие не прокатит.

Но старый-то стек в адресном пространстве виден. А у тебя к тому времени когда дочерний поток начинает работать, родительский поток еще не вышел из той функции которая va_** аргументы получила?

gods-little-toy ★★★
()
Ответ на: комментарий от Deleted

> единственный вариант, это "распарсить" va_list, засунуть в какой-нибудь список (а-ля GList) и передать потоку.

Вообще я бы так и поступил, чтоб не ловить глюки. Ho теоретически вопрос интересный...

gods-little-toy ★★★
()
Ответ на: комментарий от Deleted

> Может кто прокомментирует мои доводы?

Вряд ли.

> может я где-нибудь ошибаюсь?

О да,

Что ты пытаешься сделать? Привел бы пример.

tailgunner ★★★★★
()
Ответ на: комментарий от Deleted

> единственный вариант, это "распарсить" va_list, засунуть в какой-нибудь список (а-ля GList) и передать потоку.

Чтоб я виндой всю жизнь пользовался, если я не то же самое в прошлом треде писал.

ShprotX
()
Ответ на: комментарий от gods-little-toy

>А у тебя к тому времени когда дочерний поток начинает работать, родительский поток еще не вышел из той функции которая va_** аргументы получила?

в том то и дело, что функция создает поток и выходит. так что никакие va_copy тут не помогут (если я правильно понимаю).

Deleted
()
Ответ на: комментарий от tailgunner

>Что ты пытаешься сделать? Привел бы пример.

так в топикстарте и привел... хочу передать va_list в поток.

abc(a,b,...)
{

  va_list args;


  va_start(args, b);

  // здесь я создаю поток и хочу args передать потоку

  va_end (args);

}

Deleted
()
Ответ на: комментарий от Deleted

> в том то и дело, что функция создает поток и выходит. так что никакие va_copy тут не помогут (если я правильно понимаю).

Тогда конечно. va_list - это какой-то замаскированный указатель на стек, конкретно на фрейм вызова твоей функции. Если ты из нее вышел, то фрейм разрушили и уже ни из какого thread'а лазать по аргументам нельзя...

gods-little-toy ★★★
()
Ответ на: комментарий от Deleted

abc(a,b,...)
{ 
  va_list args;
  va_start(args, b);
  // здесь я создаю поток и хочу args передать потоку
  /**** А здесь надо подождать пока поток разделается с args *****/
  va_end (args); 
}

gods-little-toy ★★★
()
Ответ на: комментарий от ShprotX

>Чтоб я виндой всю жизнь пользовался,

хорошо сказал :)))

>если я не то же самое в прошлом треде писал.

так если бы сразу кто-нибудь сказал, что va_list в поток не передать (нее, можно костылей налепить, не спорю... задержки выставить, чтобы стек не опустел раньше времени и тд).

Deleted
()
Ответ на: комментарий от gods-little-toy

> /**** А здесь надо подождать пока поток разделается с args *****/

про костыли чуть выше отписал :)

Deleted
()
Ответ на: комментарий от Deleted

> единственный вариант, это "распарсить" va_list, засунуть в какой-нибудь список (а-ля GList) и передать потоку.

Да.

Legioner ★★★★★
()
Ответ на: комментарий от Deleted

>так если бы сразу кто-нибудь сказал, что va_list в поток не передать

va_list - это чисто стековый мезанизм, а у разных нитей независимы стеки, так что передать va_list в другуб нить можно, но за последствия отвечаешь сам.

Кстати, ты так и не объяснил, что пытаешься сделать ;)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Кстати, ты так и не объяснил, что пытаешься сделать

Он пытается понять, что va_list ему между потоками передать не получится :)

ShprotX
()
Ответ на: комментарий от ShprotX

>Он пытается понять, что va_list ему между потоками передать не получится :)

именно это я и пытался понять :). когда влючил моцк...

>что-то меня тут осенило... для потока ведь создается собственный стек, а все манипуляции с va_* это манипуляции со стеком текущего процесса

два дня тупил :)

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.