#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
Проблема с pthread_create
Проблема в следующем: при вызове pthread_create по адресу в первом параметре должен записаться ID созданного потока. По факту туда записывается неведомое отрицательное число, как при инициализации переменной компилятором. В функции потока gettid возвращает адекватный ID потока.
ОС Ubuntu 10.10
Подскажите, что не так?
Код:
pthread, а не игрушки из под кровати.
Используя pthread, используйте
...
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]
не могли бы вы пояснить подробнее, что конкретно вы называете игрушками из-под кровати.
Код:
tid = syscall(SYS_gettid);
Код:
tid = gettid();
В результате получал:
undefined reference to `gettid`
cololect2: ld returned 1 exit status
Если есть другой способ вызвать gettid, поведайте.
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
Все, что вы написали, мне известно. Первоначальный вопрос был к Ramon по поводу игрушек из-под кровати
Так вам же ответили уже - при работе с POSIX threads НЕ НАДО использовать gettid. Об этом вам и говорил Ramon.
всем спасибо, разобрался.