저는 우분투 20.04 LTS를 사용하고 있습니다. 커널 버전은 5.4.0-42입니다.
다음은 샘플 프로그램입니다:
// mre.c
// Compile with: cc -o mre mre.c -lSDL2
#include <stdio.h>
#include <SDL2/SDL.h>
int main(void)
{
SDL_Init(SDL_INIT_VIDEO); // Doesn't work without SDL_INIT_VIDEO
getchar();
}
./mre
스레드 이름이 open 인 실행 중인 프로그램을 보면 htop
다음과 같은 4개의 스레드가 있음을 알 수 있습니다.
mre:disk$3
mre:disk$2
mre:disk$1
mre:disk$0
/usr/libexec/ibus-x11
비슷한 이름을 가진 스레드 는 다음과 같습니다 .
ibus-x1:disk$3
ibus-x1:disk$2
ibus-x1:disk$1
ibus-x1:disk$0
많은 프로그램에는 이러한 기능이 없습니다. (특정 그래픽 인터페이스를 사용하지 않는 것일 수도 있습니다.)
이러한 스레드는 항상 4개(내 컴퓨터에는 4개의 코어가 있음)가 있으며 내림차순으로 나열됩니다. /usr/lib/xorg/Xorg
이러한 스레드는 8개이며 각 숫자 0-3에 대해 2개가 있습니다. 그것들은 무엇을 위해 사용됩니까?
답변1
이 스레드는 다음 용도로 사용됩니다.메사 디스크 캐시:
util_queue_init(&cache->cache_queue, "disk$", 32, 4,
UTIL_QUEUE_INIT_RESIZE_IF_FULL |
UTIL_QUEUE_INIT_USE_MINIMUM_PRIORITY |
UTIL_QUEUE_INIT_SET_FULL_THREAD_AFFINITY);
https://sources.debian.org/src/mesa/22.0.3-1/src/util/disk_cache.c/?hl=174#L174
그런 다음 내부 util_queue_init()
:
/* Form the thread name from process_name and name, limited to 13
* characters. Characters 14-15 are reserved for the thread number.
* Character 16 should be 0. Final form: "process:name12"
*
* If name is too long, it's truncated. If any space is left, the process
* name fills it.
*/
https://sources.debian.org/src/mesa/22.0.3-1/src/util/u_queue.c/?hl=405#L414-L420
따라서 어떤 방식으로든 이 데스크탑 코드를 호출하는 모든 GUI 프로세스는 예를 들어 내 f33 데스크탑 시스템에서 이러한 추가 스레드를 생성합니다.
pid tid comm cls
1942 1989 gnome-s:disk$0 BAT
1942 1990 gnome-s:disk$1 BAT
1942 1991 gnome-s:disk$2 BAT
1942 1992 gnome-s:disk$3 BAT
2041 2237 Xwaylan:disk$0 BAT
2041 2238 Xwaylan:disk$1 BAT
2041 2239 Xwaylan:disk$2 BAT
2041 2240 Xwaylan:disk$3 BAT
2041 2259 Xwaylan:disk$0 BAT
2041 2260 Xwaylan:disk$1 BAT
2041 2261 Xwaylan:disk$2 BAT
2041 2262 Xwaylan:disk$3 BAT
2292 2325 gsd-xse:disk$0 BAT
2292 2326 gsd-xse:disk$1 BAT
2292 2327 gsd-xse:disk$2 BAT
2292 2328 gsd-xse:disk$3 BAT
2307 2344 ibus-x1:disk$0 BAT
2307 2345 ibus-x1:disk$1 BAT
2307 2346 ibus-x1:disk$2 BAT
2307 2347 ibus-x1:disk$3 BAT
2464 2578 firefox:disk$0 BAT
2464 2579 firefox:disk$1 BAT
2464 2580 firefox:disk$2 BAT
2464 2581 firefox:disk$3 BAT
2756 2785 firefox:disk$0 BAT
2756 2786 firefox:disk$1 BAT
2756 2787 firefox:disk$2 BAT
2756 2788 firefox:disk$3 BAT
2806 2841 firefox:disk$0 BAT
2806 2842 firefox:disk$1 BAT
2806 2843 firefox:disk$2 BAT
2806 2844 firefox:disk$3 BAT
2919 3078 firefox:disk$0 BAT
2919 3079 firefox:disk$1 BAT
2919 3080 firefox:disk$2 BAT
2919 3081 firefox:disk$3 BAT
3346 3367 firefox:disk$0 BAT
3346 3368 firefox:disk$1 BAT
3346 3369 firefox:disk$2 BAT
3346 3370 firefox:disk$3 BAT
3408 3426 firefox:disk$0 BAT
3408 3427 firefox:disk$1 BAT
3408 3428 firefox:disk$2 BAT
3408 3429 firefox:disk$3 BAT
5794 5825 firefox:disk$0 BAT
5794 5826 firefox:disk$1 BAT
5794 5827 firefox:disk$2 BAT
5794 5828 firefox:disk$3 BAT
6345 6364 firefox:disk$0 BAT
6345 6365 firefox:disk$1 BAT
6345 6366 firefox:disk$2 BAT
6345 6367 firefox:disk$3 BAT
9502 9525 firefox:disk$0 BAT
9502 9526 firefox:disk$1 BAT
9502 9527 firefox:disk$2 BAT
9502 9528 firefox:disk$3 BAT
22548 22565 firefox:disk$0 BAT
22548 22566 firefox:disk$1 BAT
22548 22567 firefox:disk$2 BAT
22548 22568 firefox:disk$3 BAT
33788 33807 vlc:disk$0 BAT
33788 33808 vlc:disk$1 BAT
33788 33809 vlc:disk$2 BAT
33788 33810 vlc:disk$3 BAT
48178 74574 kwallet:disk$0 BAT
48178 74575 kwallet:disk$1 BAT
48178 74576 kwallet:disk$2 BAT
48178 74577 kwallet:disk$3 BAT
60824 60830 chromiu:disk$0 BAT
60824 60831 chromiu:disk$1 BAT
60824 60832 chromiu:disk$2 BAT
60824 60833 chromiu:disk$3 BAT
69502 69519 firefox:disk$0 BAT
69502 69520 firefox:disk$1 BAT
69502 69521 firefox:disk$2 BAT
69502 69522 firefox:disk$3 BAT
답변2
Linux에서는 C 또는 C++ 프로그램에서 다음을 사용할 수 있습니다.pthread_setname_np(3)-사용prctl(2)시스템 호출 - 스레드 이름을 변경합니다.
바이너리(또는 프로그램에서 사용하는 라이브러리)라이브러리 SDL) 일반적으로 성공하는 함수를 호출하기로 결정합니다.
당신은 사용할 수 있습니다데이터베이스(1),트랙(1),트랙(1)더 많은 연구를 해보세요. 아니면 소스코드를 공부해보세요라이브러리 SDL
당신이 사용하는 경우걸프 협력 협의회컴파일러, C++ 코드를 컴파일합니다.그리고 g++ -Wall -Wextra -g
(어쩌면 다시 컴파일라이브러리 SDL소스 코드에서 가져오고, 오픈 소스이므로 최소한 소스 코드를 연구하세요.)