LINUX.ORG.RU
ФорумJob

Сделать pthread функцию с аргументами.

 ,


0

1

Собственно у одной программы надо сделать pthread функцию, которая будет выполняться параллельно остальным нитям.

Оплата с банковской карты.

Подробности jabber/gtalk/email: ${nickname}@gmail.com

★★★★★

Последнее исправление: steemandlinux (всего исправлений: 1)
Ответ на: комментарий от FIL

На мыло напишу :) Я просто сам не могу множественные аргументы передать через pthread.

steemandlinux ★★★★★
() автор топика

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

jo_b1ack ★★★★★
()
Ответ на: комментарий от deep-purple

Взялся что? Указатели приводить? :-D

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

одно дело рассказать, другое сделать) кому не лень пусть срубит бабла)

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

Оно, оно, только структура какая-то.

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

Да, указатель на эту структуру я в поток и передаю. А в самом потоке преобразую обратно:

void* another_change(void *data){
windowData *win = (windowData*) data; 
...
Тебе уже в самом начале сказали, как это делать. Кстати, ты еще и что-нибудь можешь возвращать при завершении потока (как аргумент pthread_exit или в return), а потом анализировать это в pthread_join.

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

Кстати, ты еще и что-нибудь можешь возвращать при завершении потока (как аргумент pthread_exit или в return), а потом анализировать это в pthread_join.

Нет, мне его только очищать надо.

steemandlinux ★★★★★
() автор топика

Вообщем мне надо собрать linphone-3.6.1 с использованием библиотеки eXosip-4, на линфон кладется отдельный патч linphone-3.6.1-exosip-4.patch.

Из функции

static int call_proceeding(Sal *sal, eXosip_event_t *ev)
надо вызвать новую нить и передать в неё аргументы:

sal->excontext

ev->cid

ev->did

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

А функция в pthread потоке пусть будет

eXosip_call_terminate(sal->excontext, ev->cid, ev->did);
steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от steemandlinux
typedef struct{
  Sal *sal;
  eXosip_event_t *ev;
} shit;

void *shitthread(void *arg){
  shit *usedargs = (shit*) arg;
  // и используй shit->sal->excontext и т.п.
... 
  return NULL;
}

...
// и где-нибудь в шестой функции:
  pthread_t thread;
  shit *somearg; 
  // инициализируешь somearg
  pthread_create(thread, NULL, &shitthread, (void*)somearg);
  ...
  pthread_join(thread, NULL);
Eddy_Em ☆☆☆☆☆
()

И вообще, тебе не стыдно такую чепуху в job выкладывать?

Оплата с банковской карты

50 рублей?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от steemandlinux

Какую инициализацию? Тут же вообще элементарщина с первых страниц K&R.

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

Бесполезно :(

Что ему за выражение нужно?

sal_eXosip2.c: In function 'shitthread':
sal_eXosip2.c:1530:25: error: expected expression before 'shit'
   eXosip_call_terminate(shit->sal->excontext, shit->ev->cid, shit->ev->did);
                         ^
sal_eXosip2.c:1530:3: error: too few arguments to function 'eXosip_call_terminate'
   eXosip_call_terminate(shit->sal->excontext, shit->ev->cid, shit->ev->did);
   ^
In file included from /usr/include/eXosip2/eXosip.h:30:0,
                 from sal_eXosip2.h:24,
                 from sal_eXosip2.c:23:
/usr/include/eXosip2/eX_call.h:214:7: note: declared here
   int eXosip_call_terminate (struct eXosip_t *excontext, int cid, int did);
       ^
sal_eXosip2.c:1528:9: warning: unused variable 'usedargs' [-Wunused-variable]
   shit *usedargs = (shit*) arg;
         ^
sal_eXosip2.c: In function 'call_proceeding':
sal_eXosip2.c:1567:18: warning: passing argument 1 of 'pthread_create' makes pointer from integer without a cast
   pthread_create(thread, NULL, &shitthread, (void*)somearg);
                  ^
In file included from /usr/include/ortp/port.h:32:0,
                 from /usr/include/ortp/logging.h:29,
                 from /usr/include/mediastreamer2/mscommon.h:22,
                 from sal.h:29,
                 from sal_eXosip2.h:23,
                 from sal_eXosip2.c:23:
/usr/include/pthread.h:235:12: note: expected 'pthread_t * __restr
steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

windowData *win = (windowData*) data;

Ты прям человек контрастов. То гласишь о неприязни к C++, то пишешь C код с кусками для совместимости с C++.

Если пишешь на C, надо писать

windowData *win = data;
Если пишешь на C++, надо писать
windowData *win = reinterpret_cast<windowData *>(data);

А этот промежуточный вариант одинаково крив и для C и для C++.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от steemandlinux

Что ему за выражение нужно?

Написано же: «passing argument 1 of 'pthread_create' makes pointer from integer without a cast». Передаёшь целое число туда, где ожидается указатель. _create(&thread

i-rinat ★★★★★
()
Ответ на: комментарий от steemandlinux

Ты где-то накосячил с указателями.

Если пишешь так:

shit *usedargs = (shit*) arg;
то и вызывай
usedargs->sal->excontext
У тебя же shit — это тип, а не переменная!!!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от steemandlinux

Это же совсем просто! С — это тебе не пхытон какой-то! В сях все на пальцах понятно и элементарно. Это не говноязычок вроде С++ или какого-нибудь эрланга...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от i-rinat

4.2!

Подсказываю: я никогда не компиляю без опций -Wall -Wextra -Werror -W

А теперь укажи их и посмотри.

// без этих опций только быдлокодеры свои поделки собирают.

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

4.2!

Факториал не определён на дробных числах. Пользуйся Гамма-функцией.

А теперь укажи их и посмотри.

Указал. Всё чисто. Может тебе стоит самому попробовать?

i-rinat ★★★★★
()
Ответ на: комментарий от Eddy_Em

Эдуард, а как убрать ожидание завершения работы нити в основной функции?

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

Это поток. Не надо меня "нитями" пугать!

А выполнения потока надо бы подождать, а то есть шанс убить его раньше времени.

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