1. ホーム
  2. c

[解決済み] c linuxでスレッドを破壊する方法

2022-02-28 01:32:43

質問

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以上のスレッドを作成することはできませんので、ここではシングルスレッドのみを使用する必要があります。

解決方法は?

ええと、あなたが本当にしたいことは、そのようなことだと思います。

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