Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с pthread_create

56K
01 декабря 2011 года
bum-bayan
16 / / 04.07.2010
Доброго времени суток.
Проблема в следующем: при вызове pthread_create по адресу в первом параметре должен записаться ID созданного потока. По факту туда записывается неведомое отрицательное число, как при инициализации переменной компилятором. В функции потока gettid возвращает адекватный ID потока.
ОС Ubuntu 10.10
Подскажите, что не так?

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>
#include <sys/syscall.h>
#include <fcntl.h>
#include <unistd.h>

#include <pthread.h>

#define _GNU_SOURCE
#define _DEBUG

int tfres = 0;

void* line_to_file(void* line);

int main(int argc, char* argv[])
{
    pthread_t tid = 0;
    int tretcode = 0;
    int* p_tretcode = &tretcode;

    printf("Process with PID: %d started\n", getpid());

    if (pthread_create(&tid, NULL, line_to_file, (void *)"test_line\n")) {
        perror("thread creating problem");
        exit(1);
    }

#ifdef _DEBUG
    printf("DEBUG: thread with tid %d has been created\n", (int)tid);
#endif

    pthread_join(tid, (void **)&p_tretcode);
#ifdef _DEBUG
    printf("DEBUG: thread with tid %d has been completed with return code %d\n",
                                                            (int)tid, tretcode);
#endif

    printf("Process with PID: %d preparing to completd\n", getpid());
    return 0;
}

// function working in thread
void* line_to_file(void* line)
{
    int fd = 0;
    pid_t tid = 0;
    char filename[16] = {0};
    ssize_t bytes_written = 0;
    size_t size = strlen(line);

    tid = syscall(SYS_gettid);
    sprintf(filename, "file-%d.dat", tid);

    if ((fd = open(filename, O_CREAT | O_RDWR | O_TRUNC, 0644)) == -1) {
                perror("line_to_file -> creating log file problem");
                tfres = -1;
        pthread_exit((void *)tfres);
    }

    bytes_written = write(fd, line, size);
#ifdef _DEBUG
    printf("DEBUG: bytes_written %d\n", bytes_written);
#endif

    return (void *)tfres;
}// line_to_file
260
01 декабря 2011 года
Ramon
1.1K / / 16.08.2003
Используя pthread, используйте pthread, а не игрушки из под кровати.
277
01 декабря 2011 года
arrjj
1.7K / / 26.01.2011
[quote=man gettid]
...
NOTES
...

The thread ID returned by this call is not the same thing as a POSIX
thread ID (i.e., the opaque value returned by pthread_self(3)).

...
[/quote]
И ещё
[quote=man pthread_create]
...
Before returning, a successful call to pthread_create() stores the ID
of the new thread in the buffer pointed to by thread; this identifier
is used to refer to the thread in subsequent calls to other pthreads
functions.
...
[/quote]
56K
01 декабря 2011 года
bum-bayan
16 / / 04.07.2010
Ramon,
не могли бы вы пояснить подробнее, что конкретно вы называете игрушками из-под кровати.
240
01 декабря 2011 года
aks
2.5K / / 14.07.2006
Ну судя по всему вот эту еретическую конструкцию:

 
Код:
tid = syscall(SYS_gettid);
56K
01 декабря 2011 года
bum-bayan
16 / / 04.07.2010
Уже пробовал использовать

 
Код:
tid = gettid();


В результате получал:
undefined reference to `gettid`
cololect2: ld returned 1 exit status

Если есть другой способ вызвать gettid, поведайте.
277
01 декабря 2011 года
arrjj
1.7K / / 26.01.2011
[COLOR="silver"]Будь мужиком, юзай man, бл#@ть![/COLOR]

man gettid
блаблабла...
NOTES
Glibc does not provide a wrapper for this system call; call it using
syscall(2).

блаблабла...

man pthread_self
NOTES
блаблабла...
Thread IDs are only guaranteed to be unique within a process. A thread
ID may be reused after a terminated thread has been joined, or a
detached thread has terminated.
The thread ID returned by pthread_self() is not the same thing as the
kernel thread ID returned by a call to gettid(2).

блаблабла...

Коротко о главном:
gettid - системный вызов, непортируемый, thread ID выдаётся ядром системы,гарантировано уникально для каждого потока в системе.
pthread_self - часть реализации POSIX, портируема, thread ID выдаётся реализацией потоков,гарантировано уникально только в пределах одного процесса.

glibc не содержит gettid, поэтому вызывается через syscall
56K
01 декабря 2011 года
bum-bayan
16 / / 04.07.2010
Все, что вы написали, мне известно. Первоначальный вопрос был к Ramon по поводу игрушек из-под кровати
240
02 декабря 2011 года
aks
2.5K / / 14.07.2006
Так вам же ответили уже - при работе с POSIX threads НЕ НАДО использовать gettid. Об этом вам и говорил Ramon.
56K
03 декабря 2011 года
bum-bayan
16 / / 04.07.2010
всем спасибо, разобрался.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог