上篇文章的代码中sleep函数用的很是不合适,所以改了一下代码(其实就是多加了两个变量),删去sleep之后,程序瞬间结束~~
下面是代码:
#include <stdio.h>
#include <pthread.h>
typedef struct myTestType
{
int threadID;
int dataNum;
int repeatNum;
int *threadNum;
int *input;
int *output;
int *index;
int *endFlag;
int *index2;
int *endFlag2;
int *repeatFlag;
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)
{
//sleep(1);
}
return output;
}
int generate(int index) {
int input;
if(index % 4 == 0)
input = (1 << (index%30)) + 1;
else
input = (7 << (index%16)) + 1;
return input;
}
void thread(myTest * pMyTest) {
printf("Begin threadID=%u run!\n", pMyTest->threadID);
int index, index2, rindex, input, output;
int threadID = pMyTest->threadID;
int dataNum = pMyTest->dataNum;
int repeatNum = pMyTest->repeatNum;
pthread_mutex_lock(pMyTest->pMutIndex);
rindex = pMyTest->repeatFlag[0];
pMyTest->repeatFlag[0]++;
pthread_mutex_unlock(pMyTest->pMutIndex);
while(rindex < pMyTest->threadNum[0]*repeatNum-1) {
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\n", 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_mutex_lock(pMyTest->pMutIndex);
pMyTest->endFlag[0]++;
pthread_mutex_unlock(pMyTest->pMutIndex);
pMyTest->index2[0] = 0;
pMyTest->endFlag2[0] = 0;
while(pMyTest->endFlag[0] < pMyTest->threadNum[0])
;
pthread_mutex_lock(pMyTest->pMutIndex);
index2 = pMyTest->index2[0];
pMyTest->input[index2] = generate(index2);
pMyTest->output[index2] = 0;
pMyTest->index[0]++;
pthread_mutex_unlock(pMyTest->pMutIndex);
while(index2 < dataNum) {
printf("threadid=%d,rindex=%d\n", threadID, rindex);
pthread_mutex_lock(pMyTest->pMutIndex);
pMyTest->input[index2] = generate(index2);
pthread_mutex_unlock(pMyTest->pMutIndex);
index2 = pMyTest->index2[0];
pMyTest->index2[0]++;
}
pthread_mutex_lock(pMyTest->pMutIndex);
pMyTest->endFlag2[0]++;
pthread_mutex_unlock(pMyTest->pMutIndex);
pMyTest->index[0] = 0;
pMyTest->endFlag[0] = 0;
while(pMyTest->endFlag2[0] < pMyTest->threadNum[0])
;
pthread_mutex_lock(pMyTest->pMutIndex);
rindex = pMyTest->repeatFlag[0];
pMyTest->repeatFlag[0]++;
pthread_mutex_unlock(pMyTest->pMutIndex);
}
pthread_mutex_lock(pMyTest->pMutIndex);
pMyTest->threadNum[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 = 30;
pMyTest->repeatNum = 11;
pMyTest->input = (int *)malloc(sizeof(int)*pMyTest->dataNum);
pMyTest->output = (int *)malloc(sizeof(int)*pMyTest->dataNum);
for(i=0; i<pMyTest->dataNum;++i) {
pMyTest->input[i] = generate(i);
}
pMyTest->threadNum = (int *)calloc(1, sizeof(int));
pMyTest->index = (int *)calloc(1, sizeof(int));
pMyTest->endFlag = (int *)calloc(1, sizeof(int));
pMyTest->index2 = (int *)calloc(1, sizeof(int));
pMyTest->endFlag2 = (int *)calloc(1, sizeof(int));
pMyTest->repeatFlag = (int *)calloc(1, sizeof(int));
pMyTest->pMutIndex = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t));
pthread_mutex_init(pMyTest->pMutIndex, NULL);
pMyTest->threadNum[0] = 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.\n");
for(i=0; i<threadNum; ++i) {
ret = pthread_create(tid+i, NULL, (void *)thread, (myTest *)(inMyTest+i));
if(ret != 0) {
printf("Create pthread error.\n");
return 0;
}
}
for(i=0; i<threadNum; i++)
pthread_join(tid[i], NULL);
free(tid);
free(inMyTest);
pthread_mutex_destroy(pMyTest->pMutIndex);
free(pMyTest->pMutIndex);
free(pMyTest->threadNum);
free(pMyTest->input);
free(pMyTest->output);
free(pMyTest->index);
free(pMyTest->index2);
free(pMyTest->endFlag);
free(pMyTest->endFlag2);
free(pMyTest->repeatFlag);
free(pMyTest);
return 0;
}