모든 pthread가 완료될 때까지 어떻게 기다려야 합니까?
기본 스레드가 종료되기 전에 모든 스레드가 완료될 때까지 기다리길 바랄 뿐입니다.
스레드는 여러 가지 이유로 많이 오가고, 모든 스레드를 추적하고 싶지는 않습니다. 모든 스레드가 언제 사라졌는지 알고 싶을 뿐입니다.
wait()는 자식 프로세스에 대해 이 작업을 수행하며, 자식이 남아 있지 않을 때 ECHILD를 반환하지만 wait는 (p) 스레드와 함께 작동하지 않습니다.
저는 정말로 모든 미결 스레드 목록을 보관하고(그들이 오고 갈 때) pthread_join을 각각 호출해야 하는 어려움을 겪고 싶지 않습니다.
이것을 신속하고 더러운 방법으로 할 수 있습니까?
모든 스레드가 완료된 후 메인 스레드에서 특별히 수행할 작업을 원하십니까?
않은 에서 간단히 할 수 pthread_exit()
에것)로 exit()
).
한다면main()
(는)합니다를 exit()
합니다. 만약단,main()
pthread_exit()
대신에,에에 exit()
발생하지 않으며 프로세스가 즉시 종료되지 않습니다. 모든 스레드가 종료되면 종료됩니다.
너무 빨리 더럽게 할 순 없어요.
여기에 차이점을 알 수 있는 작은 예시 프로그램이 있습니다.통과하다-DUSE_PTHREAD_EXIT
프로세스가 모든 스레드가 완료될 때까지 기다리도록 컴파일러에 전달합니다.해당 매크로를 정의하지 않고 컴파일하여 해당 매크로의 프로세스 중지 스레드를 트랙에서 확인합니다.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
static
void sleep(int ms)
{
struct timespec waittime;
waittime.tv_sec = (ms / 1000);
ms = ms % 1000;
waittime.tv_nsec = ms * 1000 * 1000;
nanosleep( &waittime, NULL);
}
void* threadfunc( void* c)
{
int id = (int) c;
int i = 0;
for (i = 0 ; i < 12; ++i) {
printf( "thread %d, iteration %d\n", id, i);
sleep(10);
}
return 0;
}
int main()
{
int i = 4;
for (; i; --i) {
pthread_t* tcb = malloc( sizeof(*tcb));
pthread_create( tcb, NULL, threadfunc, (void*) i);
}
sleep(40);
#ifdef USE_PTHREAD_EXIT
pthread_exit(0);
#endif
return 0;
}
적절한 방법은 pthread_id의 모든 pthread를 추적하는 것이지만, 당신은 빠르고 더러운 방법을 요구해서 여기 있습니다.기본적으로:
- 실행 중인 스레드의 총 수를 유지할 뿐입니다.
- pthread_create를 호출하기 전에 주 루프에서 증분합니다.
- 각 스레드가 끝날 때마다 스레드 수를 줄입니다.
- 그런 다음 카운트가 0이 될 때까지 주 공정이 끝날 때까지 잠을 잡니다.
.
volatile int running_threads = 0;
pthread_mutex_t running_mutex = PTHREAD_MUTEX_INITIALIZER;
void * threadStart()
{
// do the thread work
pthread_mutex_lock(&running_mutex);
running_threads--;
pthread_mutex_unlock(&running_mutex);
}
int main()
{
for (i = 0; i < num_threads;i++)
{
pthread_mutex_lock(&running_mutex);
running_threads++;
pthread_mutex_unlock(&running_mutex);
// launch thread
}
while (running_threads > 0)
{
sleep(1);
}
}
스레드를 추적하지 않으려면 스레드를 분리하여 해당 스레드에 신경 쓸 필요가 없습니다. 하지만 스레드가 완료된 시점을 알려면 조금 더 나아가야 합니다.
한 가지 방법은 스레드의 상태 목록(링크된 목록, 배열 등)을 보관하는 것입니다.스레드가 시작되면 배열의 상태를 TRADE_STATUS_RUNNING과 같은 것으로 설정하고 종료 직전에 상태를 TRADE_STATUS_STOPPED와 같은 것으로 업데이트합니다.그런 다음 모든 스레드가 중지되었는지 확인하려면 이 배열 위에서 반복하고 모든 상태를 확인하면 됩니다.
이와 같은 작업을 수행할 경우 한 번에 하나의 스레드만 액세스(읽기 및 쓰기)할 수 있도록 배열에 대한 액세스를 제어해야 하므로 이 위에 뮤텍스(mutex)를 사용해야 한다는 것을 잊지 마십시오.
모든 스레드 ID 목록을 보관한 다음 각 스레드에 대해 dopthread_join를 수행할 수 있습니다. 물론 스레드 ID 목록에 대한 액세스를 제어하려면 뮤텍스가 필요합니다.또한 반복되는 동안 수정할 수 있는 일종의 목록이 필요합니다. 아마 std::set<pthread_t>?
int main() {
pthread_mutex_lock(&mutex);
void *data;
for(threadId in threadIdList) {
pthread_mutex_unlock(&mutex);
pthread_join(threadId, &data);
pthread_mutex_lock(&mutex);
}
printf("All threads completed.\n");
}
// called by any thread to create another
void CreateThread()
{
pthread_t id;
pthread_mutex_lock(&mutex);
pthread_create(&id, NULL, ThreadInit, &id); // pass the id so the thread can use it with to remove itself
threadIdList.add(id);
pthread_mutex_unlock(&mutex);
}
// called by each thread before it dies
void RemoveThread(pthread_t& id)
{
pthread_mutex_lock(&mutex);
threadIdList.remove(id);
pthread_mutex_unlock(&mutex);
}
좋은 답변 주셔서 감사합니다!메모리 장벽 등을 사용하는 것에 대한 많은 이야기가 있었습니다. 그래서 저는 메모리 장벽을 사용하는 것을 적절하게 보여주는 답변을 게시해야겠다고 생각했습니다.
#define NUM_THREADS 5
unsigned int thread_count;
void *threadfunc(void *arg) {
printf("Thread %p running\n",arg);
sleep(3);
printf("Thread %p exiting\n",arg);
__sync_fetch_and_sub(&thread_count,1);
return 0L;
}
int main() {
int i;
pthread_t thread[NUM_THREADS];
thread_count=NUM_THREADS;
for (i=0;i<NUM_THREADS;i++) {
pthread_create(&thread[i],0L,threadfunc,&thread[i]);
}
do {
__sync_synchronize();
} while (thread_count);
printf("All threads done\n");
}
__sync 매크로는 "비표준" GCC 내부 매크로입니다.LLVM도 이를 지원하지만 다른 컴파일러를 사용하는 경우 다른 작업을 수행해야 할 수도 있습니다.
또 다른 중요한 사항은 다음과 같습니다.쉽게 작동시킬 수 있는데 왜 코어 전체를 태우거나, CPU 회전의 절반을 타이트한 폴 루프에서 다른 사람들이 끝날 때까지 기다리면서 낭비하는 것입니까?다음 모드는 초기 스레드를 사용하여 작업자 중 한 명을 실행한 다음 다른 작업이 완료될 때까지 기다립니다.
thread_count=NUM_THREADS;
for (i=1;i<NUM_THREADS;i++) {
pthread_create(&thread[i],0L,threadfunc,&thread[i]);
}
threadfunc(&thread[0]);
do {
__sync_synchronize();
} while (thread_count);
printf("All threads done\n");
}
스레드를 "0"이 아닌 "1"부터 생성하기 시작한 다음 "thread 0"을 인라인으로 직접 실행하여 모든 스레드가 완료될 때까지 기다립니다.우리는 일관성을 위해 (여기서 의미가 없음에도 불구하고) &thread[0]를 전달합니다. 하지만 실제로는 여러분 자신의 변수/맥락을 전달할 것입니다.
언급URL : https://stackoverflow.com/questions/6154539/how-can-i-wait-for-any-all-pthreads-to-complete
'source' 카테고리의 다른 글
HTTP Put은 어떻게 합니까? (0) | 2023.10.03 |
---|---|
자바스크립트로 새 창에서 URL 열기 (0) | 2023.10.03 |
Oracle: SELECT 문으로 임시 테이블 생성 (0) | 2023.10.03 |
WordPress Post에서 사용자 지정 표준 URL 지정 (0) | 2023.10.03 |
워드프레스:작성자 페이지에서 사용자 정의 분류법에 따라 포스트 카운트를 표시하는 방법 (0) | 2023.10.03 |