Pthread - Как запустить новый поток без вызова соединения?
Я хочу начать новый поток из основного потока. Я не могу использовать соединение, так как не хочу ждать выхода потока и возобновления выполнения.
В основном то, что мне нужно, это что-то вроде pthread_start (...), но не может найти его.
Edit:
Поскольку все ответы, предложенные create_thread, должны начинаться с потока, проблема заключается в том, что в простом коде ниже это не работает. Результат программы ниже - "основной поток". Похоже, что нить никогда не выполнялась. Любая идея, где я ошибаюсь?
скомпилирован и запущен на Fedora 14 GCC версии 4.5.1
void *thread_proc(void* x)
{
printf ("sub thread.\n");
pthread_exit(NULL);
}
int main()
{
pthread_t t1;
int res = pthread_create(&t1, NULL, thread_proc, NULL);
if (res)
{
printf ("error %d\n", res);
}
printf("main thread\n");
return 0;
}
Ответы
Ответ 1
Функция запуска потока pthread_create
, а не
pthread_join
. Вы используете только pthread_join
, когда будете готовы ждать,
и повторно синхронизировать, и если вы отсоедините поток, нет необходимости использовать
это вообще. Вы также можете присоединиться к другому потоку.
Перед выходом (либо путем вызова exit
, либо путем возврата из main
),
вы должны убедиться, что ни один другой поток не запущен. Один способ (но не
единственное), чтобы сделать это, присоединившись ко всем нитям, которые у вас есть
создан.
Ответ 2
поведение вашего кода зависит от планировщика; вероятно, основной выход программы перед printf в созданном потоке был выполнен. Я надеюсь, что простой сон (some_seconds) в конце main() вызовет вывод потока:)
Ответ 3
вызов join
ожидает завершения потока и выхода.
если вы хотите, чтобы ваш основной поток продолжал выполнение во время выполнения дочернего потока, не вызывайте join
: дочерний поток будет выполняться одновременно с основным потоком...
Ответ 4
Просто создайте поток с отключенным атрибутом, включенным. Для этого вы можете вызвать pthread_detach
после создания потока или pthread_attr_setdetachstate
до его создания.
Когда поток отсоединен, родительский поток не должен ждать его и не может получить возвращаемое значение.
Ответ 5
вам нужно вызвать pthread_exit в конце man(), что заставит main ждать другого потока, чтобы начать и выйти.
Или вы можете явно вызвать pthread_join, чтобы ждать вновь созданный поток
В противном случае, когда main возвращается, процесс будет убит, и весь создаваемый поток будет убит.
Ответ 6
Нить начинается автоматически, когда вы create.
Ответ 7
Вам просто не нужно называть pthread_create?
static void *thread_body(void *argument) { /* ... */ }
int main(void) {
pthread_t thread;
pthread_create(&thread, NULL, thread_body, NULL);
/* ... */
Ответ 8
Pthread_create, который приводит к созданию потока и начинает выполнение. Но когда вы хотите подождать, пока другой поток начнет использовать критический раздел, вам придется сериализовать потоки, вызвав метод pthread_join. Этот API заставит ваш поток ждать, пока другой поток завершит выполнение.
код:
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#define MAX_THREADS 100
void* workerFunction(void* inParam)
{
/* Function to write into same file*/
FILE* filePtr;
long index=(long)inParam;
char inText[100];
sprintf(inText,"\n Writing Thread Index %d", index);
//Open a file in write mode +w
filePtr = fopen("/var/tmp/ThreadSync.txt", "a");
if( filePtr == NULL)
{
printf("\n Error: Failed to open a file");
exit(1);
}
//write into file
fprintf(filePtr, "%s",inText);
fclose(filePtr);
pthread_exit(NULL);
}
int main()
{
pthread_t threads[MAX_THREADS];
pthread_attr_t attr;
long index = 0;
int returnVal;
/* Create the thread detach state attribute and pass to thread creation*/
void* status;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
/* Creation of the threads*/
for(index = 0; index<MAX_THREADS; index++)
{
returnVal = pthread_create(&threads[index], &attr,workerFunction,(void*)index);
if(returnVal)
{
printf("\n Failed to create the Thread");
exit(0);
}
}
/* Free the thread attribute */
pthread_attr_destroy(&attr);
for(index = 0; index<MAX_THREADS; index++)
{
returnVal = pthread_join(threads[index], &status);
if(returnVal)
{
printf("\nError: Failed to join the threads");
exit(1);
}
printf("\nMain: Join of the thread successful with thread index: %d & Status:%ld\n",index,(long)status);
}
printf("\n+++++++++++ END OF MAIN ++++++++++++\n");
pthread_exit(NULL);
}