스레드 코드 다중 스레드 (2): 좀 더 복잡한 프로그램

6395 단어 다중 스레드
요 며칠 동안 줄곧 스레드 코드 같은 문제를 찾고 있었는데, 오전에 마침 여러분과 공유할 기회가 있었습니다.
이 코드는 정형수조에 주어진 소수의 개수를 통계하고 그 중에서 라인에 전달되는 매개 변수는 하나의 구조이다.
#include <stdio.h>
#include <pthread.h>

int num = 0;

typedef struct myTestType
{
	int threadID;
	int threadNum;
	int dataNum;

	int *input;
	int *output;
	int *index;
	pthread_mutex_t *pMutIndex;
}myTest;

int calculate(int input) {
	int i;
	int output = 0;
	for(i=2; i<input/2; i++) {
		if(input % i == 0) {
			output = 1;
			break;
		}
	}
	if(output == 0)
	{
		num++;
		sleep(1);
	}
	return output;
}

void thread(myTest * pMyTest) {
	printf("Begin threadID=%u run!
", pMyTest->threadID); int index, input, output; int threadID = pMyTest->threadID; int dataNum = pMyTest->dataNum; pthread_mutex_lock(pMyTest->pMutIndex); index = pMyTest->index[0]; pMyTest->index[0]++; pthread_mutex_unlock(pMyTest->pMutIndex); while(index < dataNum) { input = pMyTest->input[index]; output = calculate(input); printf("index=%3u, input=%8u, output=%2u, threadID=%2u
", index, input, output, threadID); pMyTest->output[index] = output; pthread_mutex_lock(pMyTest->pMutIndex); index = pMyTest->index[0]; pMyTest->index[0]++; pthread_mutex_unlock(pMyTest->pMutIndex); } pthread_exit(NULL); } int main(void) { int i, ret; int threadNum = 2; myTest * pMyTest = (myTest *)malloc(sizeof(myTest)); pMyTest->dataNum = 100; pMyTest->input = (int *)malloc(sizeof(int)*pMyTest->dataNum); pMyTest->output = (int *)malloc(sizeof(int)*pMyTest->dataNum); for(i=0; i<pMyTest->dataNum;++i) { if(i % 4 == 0) pMyTest->input[i] = (1 << (i%30)) + 1; else pMyTest->input[i] = (7 << (i%16)) + 1; } pMyTest->index = (int *)calloc(1, sizeof(int)); pMyTest->pMutIndex = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(pMyTest->pMutIndex, NULL); pMyTest->threadNum = threadNum; myTest * inMyTest = (myTest *)malloc(sizeof(myTest)*threadNum); for(i=0; i<threadNum; ++i) { memcpy(inMyTest+i, pMyTest, sizeof(myTest)); (inMyTest+i)->threadID = i; } pthread_t * tid = (pthread_t*)malloc(sizeof(pthread_t)*threadNum); printf("Begin create pthread.
"); for(i=0; i<threadNum; ++i) { ret = pthread_create(tid+i, NULL, (void *)thread, (myTest *)(inMyTest+i)); if(ret != 0) { printf("Create pthread error.
"); return 0; } } for(i=0; i<threadNum; i++) pthread_join(tid[i], NULL); printf(" :%d
", num); free(tid); free(inMyTest); pthread_mutex_destroy(pMyTest->pMutIndex); free(pMyTest->pMutIndex); free(pMyTest->input); free(pMyTest->output); free(pMyTest->index); free(pMyTest); return 0; }

매일 같은 이치
흐르는 날은 시든 잎사귀와 꽃잎처럼 점점 멀어지는 것은 청춘의 순정과 낭만이다.얼마나 많은 비가 가슴에 흩날렸는지 바람이 귓가에 울렸는지 기억이 나지 않는다. 다만 창상이 이미 내 맘에 스며들어 내 얼굴에 기어올랐다는 것만 알 뿐이다.한 사람이 동행을 추구하면 굴곡이 동반이고 고난도 동반이다.
다른 코드는 모두 선생님이 주신 것이다.소수 개수의 통계를 실현하여 전역 변수를 응용하고 세 줄 코드만 추가했기 때문에 나는 비교적 편리하다고 생각한다.답안 코드에 myTest 구조에 비슷한 int * index 변수를 추가하여 소수의 개수를 통계하였는데, 솔직히 나는 비교적 번거롭다고 생각한다.그러나 확장성이나 안전성에 대한 고려에서 비롯될 수 있습니까?이 문제는 눈앞에 두고 다시 이야기하자.
근데 솔직히 threadNum과 데이터Num을 구조에 넣는 게 얼마나 재미있는지 모르겠어요.#define 하나면 돼요.
이번에 지난 두 번의 간단한 코드를 비교해 보니 물건이 좀 많아졌다.
우선, 라인을 창립하기 전에 정해진 작업을 멈추었는데 이런 작업은 두 번의 간단한 코드에 없었다.myTest를 가리키는 두 개의 바늘이 있는데 그 중에서 inMyTest는threadNum의 myTest 거대한 메모리 공간을 분배하여 (inmyTest+i)를 통해 각각의 myTest를 조종할 수 있다.
memcpy는 메모리에서 복사를 중지하는 데 사용됩니다.원형은void*memcpy(void*dest,constvoid*src,size t n)이다.src가 가리키는 주소를 시작 주소로 하는 연속 n 바이트의 데이터를 destin이 가리키는 주소를 시작 주소로 하는 공간으로 복사합니다.만약 inMyTest를threadNum의 작은 사각형을 수용할 수 있는 긴 사각형 상자에 비유한다면 pMyTest는 작은 사각형을 대표한다.memcpy 함수의 실행 프로세스는 이 작은 사각형을 상자 안에 넣는 프로세스이다.memcpy를 실행하기 전에 pMyTest에 메모리 분배를 중지하고 이 작업을 초기화해야 합니다.
솔직히 이런 발생 랜덤수는 처음 봤어요.방법
사실 복잡한 매개 변수와 간단한 매개 변수의 전달은 모두 차이가 많지 않다. 단지 이 예에서 지침을 전달했을 뿐이다.
    pthread_mutex_lock 및 pthreadmutex_unlock은 상호 배척 자물쇠와 관련이 있습니다.이 두 줄에 끼워진 코드는 한 라인에만 적용됩니다. (데이터가 흐트러지지 않도록 합니다.)하지만 자물쇠가 사라질 수도 있으니 여기서는 생각하지 않겠습니다.pthread 실행mutex_init 시 상호 배타적 잠금의 속성을 지정할 수 있으며 다음 네 가지가 있습니다.
    PTHREAD_MUTEX_TIMED_NP, 이것이 기본값, 즉 일반 잠금입니다.한 라인에 자물쇠를 채우면 나머지 자물쇠를 요청하는 라인은 대기 대기열을 형성하고 자물쇠를 잠근 후 우선순위에 따라 자물쇠를 가져옵니다.이런 잠금 전략은 자원 분배의 공평성을 보장한다.
    PTHREAD_MUTEX_RECURSIVE_NP, 중첩 자물쇠, 같은 라인이 같은 자물쇠에 여러 번 성공하고, 여러 번 unlock을 통해 잠금을 해제합니다.만약 서로 다른 스레드 요청이 있다면, 스레드를 잠그고 잠금을 풀 때 다시 경쟁합니다.
    PTHREAD_MUTEX_ERRORCHECK_NP, 자물쇠 검사, 같은 라인에서 같은 자물쇠를 요청하면 EDEADLK로 돌아가고 그렇지 않으면 PTHREADMUTEX_TIMED_NP 유형 동작이 같습니다.이렇게 하면 여러 번 자물쇠를 채우지 않을 때 가장 간단한 상황에서 사라진 자물쇠가 나타나지 않을 것을 보장한다.
    PTHREAD_MUTEX_ADAPTIVE_NP, 순응 잠금, 동작이 가장 간단한 잠금 유형으로 잠금 해제 후 다시 경쟁하기만을 기다린다.
한마디 하자면,calloc와malloc는 모두 메모리를 분배한 후에 주소를 되돌려 주지만, 둘은 구분이 있다.하나는malloc는분배공간의대세하나만받고,calloc는원소의수와각원소의대세두개를받습니다.또 하나는calloc가 분배된 메모리 공간을 자동으로 초기화합니다. (형식에 따라 정해집니다. 예를 들어 바늘을 NULL로 초기화하고 int 형식을 0으로 초기화합니다.)
문장이 끝나면 여러분께 프로그래머의 우스갯소리 어록을 공유합니다. 한 프로그래머는 자신의 미래에 대해 막연하기 때문에 하느님께 물어봅니다."만능의 하느님, 제 미래가 어떻게 될지 말씀해 주세요."하느님은 "내 아이, 네가 가서 립맨에게 물어봐라. 그가 지금 이끄는 프로그래머의 행렬이 지구상에서 가장 클 수도 있다"라고 말씀하셨다. 그래서 그는 립맨에게 물었다.Lippman은 "프로그래머의 미래는 프로그래머를 다루는 것이다"라고 말했는데 이 프로그래머가 이 미래에 만족하지 않자 그는 또 하느님께 물었다."만능의 하느님, 제 미래가 어떻게 될지 말씀해 주세요."하느님은 "내 아이, 네가 가츠에게 물어봐라. 그가 지금 가지고 있는 재산이 지구상에서 가장 많을 것이다."라고 말씀하셔서 가츠에게 물어보셨다.Gates가 "프로그래머의 미래는 프로그래머를 착취하는 것이다"라고 말하자 프로그래머가 이 미래에 만족하지 않자 그는 다시 하느님께 물었다."만능의 하느님, 제 미래가 어떻게 될지 말씀해 주세요."하느님은 "내 아이, 네가 후제에게 물어봐라. 그가 쓴 컴퓨터책의 독자가 지구상에서 가장 많을 것이다."라고 말씀하셨다. 그래서 그는 후제에게 물었다.후첩은 "프로그래머의 미래는 프로그래머를 유혹하는 것"이라고 말했다. 이 프로그래머는 이 미래에 대해 불만족스러워서 그는 또 하느님께 물었다."만능의 하느님, 제 미래가 어떻게 될지 말씀해 주세요."하느님은 고개를 저으셨다. "아, 내 새끼야, 너는 프로그래머가 되지 마라."
--------------------------------------오리지널 기사 By 스레드와 코드 ---------------------------------------------

좋은 웹페이지 즐겨찾기