2

我需要一个将在 while(1) 中连续调用的线程,但是当我使用 pthread_create() 调用线程函数时,会创建一个新线程。
我需要以下几点帮助:~
1)有没有什么方法可以在不创建线程的情况下调用线程函数。
2)有什么方法可以销毁前一个线程。

示例代码是

void main()
{
pthread_t thread1;
 while(1)
 {
        pthread_create( &thread1, NULL, myFun,  (void*) NULL);
 }
}
void * myFun(void *ptr)
{
printf("Hello");
}


*我们不能创建超过 380 个线程,这里我们只能使用单个线程。

4

4 回答 4

1

嗯,我想你真正想做的是这样的:

bool received_data = false;
bool beExit = false;    
struct recvPacket;

pthread_mutex_t recvMutex;

void main()
{
    pthread_t thread1;
    void *status;

    pthread_mutex_init(&recvMutex, NULL);
    pthread_create(&thread1, NULL, myFun,  (void*) NULL);        

    while(1)
    {
        if (received_data) {
           pthread_mutex_lock(&recvMutex);             // you should also synchronize received_data and beExit valuables, cuz they are shared by two threads
           /* do what you want with recvPacket */
           pthread_mutex_unlock(&recvMutex);

           received_data == false;
        }

        /* do else you want, or you can let beExit = true to stop the thread */
    }

    if (err = pthread_join(thr_main, &status))
      printf("pthread_join Error. %s\n", strerror(err)), exit(1);
}

void * myFun(void *ptr)
{
    while (!beExit) {
        if (true == tryRecvPacket()) {
           pthread_mutex_lock(&recvMutex);
           /* fill data to recvPacket */
           pthread_mutex_unlock(&recvMutex);
           received_data = true;
        }
    }
}
于 2013-10-17T08:27:48.893 回答
0

建议的设计是。

void * myFun(void *ptr);

volatile int thread_exit = 1; 

void main()
{
        pthread_t thread1;

        pthread_create( &thread1, NULL, myFun,  (void*) NULL);       

        while(1)
        {
             //Ask every 10 sec for killing thread like
             sleep(10);
             printf("Do you wish to kill [0/1]???");
             scanf("%d", &thread_exit); 
        } 


        //Add code here to make main() to wait till thread dies. 
        //pthread_join(&thread1);
}

void * myFun(void *ptr)
{
  while(thread_exit)
  {
     printf("Hello");
  }
}
于 2013-10-17T05:56:23.297 回答
0

要销毁线程,您可以使用可用的 pthread_kill 函数

int pthread_kill(pthread_t thread, int sig);

但是强行杀死线程并不是一个好习惯,因为它可能会导致内存泄漏的问题。

当父线程结束时,所有子线程都突然结束。在您的示例中,由于子线程将处于无限循环中,因此子线程永远不会完成。但父线程-main thread将在执行return 0语句后完成。所以主线程也会终止子线程。

为了克服这种情况,即等到所有子线程都完成,pthread_join(thread1)方法就在那里。所以调用这个函数的线程将等待,除非thread1已经完成。

于 2013-10-17T06:07:11.470 回答
0

感谢大家的快速回复。
问题已通过使用以下代码解决。

setsockopt (socket_desc, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,sizeof(timeout));


在这里,我设置了接受 tcp 客户端请求的超时时间(以微秒为单位)。现在代码工作正常。

于 2013-10-18T09:14:49.973 回答