Подтвердить что ты не робот

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;
}
4b9b3361

Ответ 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);
}