Exemplo n.º 1
0
static void *_CMthreadWork (void *dataPtr) {
	CMthreadData_p data = (CMthreadData_p) dataPtr;
	size_t taskId, start, end;
	CMthreadTeam_p team = (CMthreadTeam_p) data->TeamPtr;
	CMthreadJob_p  job;
    struct timeb tbs;
    long long startTime;

    pthread_mutex_lock (&(team->SMutex));
    do {
        pthread_cond_wait (&(team->SCond), &(team->SMutex));
        job = team->JobPtr;
        if (job != (CMthreadJob_p) NULL) {
            start = job->Groups[job->Group].Start;
            end   = job->Groups[job->Group].End;
            pthread_mutex_unlock(&(team->SMutex));
            ftime (&tbs);
            startTime = tbs.time * 1000 + tbs.millitm;
            for (taskId = start + data->Id; taskId < end; taskId += team->ThreadNum)
                job->UserFunc(data->Id, job->SortedTasks[taskId]->Id, job->CommonData);
            ftime (&tbs);
            data->Time += (tbs.time * 1000 + tbs.millitm - startTime);
            pthread_mutex_lock (&(team->SMutex));
            job->Completed++;
            if (job->Completed == team->ThreadNum) {
                pthread_mutex_lock   (&(team->MMutex));
                pthread_cond_signal  (&(team->MCond));
                pthread_mutex_unlock (&(team->MMutex));
            }
        }
    } while (job != (CMthreadJob_p) NULL);
    pthread_mutex_unlock (&(team->SMutex));
    pthread_exit ((void *) NULL);
}
Exemplo n.º 2
0
CMreturn CMthreadJobExecute (CMthreadTeam_p team, CMthreadJob_p job) {
    int taskId;
    struct timeb tbs;
    long long startTime, localStart;

    ftime (&tbs);
    startTime = tbs.time * 1000 + tbs.millitm;

    if (job->Sorted == false) {
        _CMthreadJobTaskSort(job);
        ftime (&tbs);
        team->ExecTime += (tbs.time * 1000 + tbs.millitm - startTime);
    }
    ftime (&tbs);
    startTime = tbs.time * 1000 + tbs.millitm;

    if (team->ThreadNum < 1) {
        ftime (&tbs);
        localStart = tbs.time * 1000 + tbs.millitm;
        for (job->Group = 0; job->Group < job->GroupNum; job->Group++) {
            for (taskId = job->Groups[job->Group].Start; taskId < job->Groups[job->Group].End; ++taskId)
                job->UserFunc(0, job->SortedTasks[taskId]->Id, job->CommonData);
        }
        ftime (&tbs);
        team->Time += (tbs.time * 1000 + tbs.millitm - localStart);
    }
    else {
        for (job->Group = 0; job->Group < job->GroupNum; job->Group++) {
            if (job->Groups[job->Group].End - job->Groups[job->Group].Start < team->ThreadNum) {
                ftime (&tbs);
                localStart = tbs.time * 1000 + tbs.millitm;
                for (taskId = job->Groups[job->Group].Start; taskId < job->Groups[job->Group].End; ++taskId)
                    job->UserFunc(0, job->SortedTasks[taskId]->Id, job->CommonData);
                ftime (&tbs);
                team->Time += (tbs.time * 1000 + tbs.millitm - localStart);
            }
            else {
                pthread_mutex_lock     (&(team->SMutex));
                job->Completed = 0;
                team->JobPtr = (void *) job;
                pthread_cond_broadcast (&(team->SCond));
                pthread_mutex_unlock   (&(team->SMutex));
                pthread_cond_wait (&(team->MCond), &(team->MMutex));
            }
        }
    }
    ftime (&tbs);
    team->ExecTime += (tbs.time * 1000 + tbs.millitm - startTime);
	return (CMsucceeded);
}
Exemplo n.º 3
0
CMreturn CMthreadJobExecute (CMthreadTeam_p team, CMthreadJob_p job) {
	int ret, taskId;
	size_t threadId;
	void  *status;
	pthread_attr_t thread_attr;

	if (team != (CMthreadTeam_p) NULL) {
		pthread_attr_init (&thread_attr);
		pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE);
		team->JobPtr = (void *) job;
		job->Group  = 0;
		if (job->Sorted == false) { _CMthreadJobTaskSort (job); job->Sorted = true; }

		for (threadId = 0; threadId < team->ThreadNum; ++threadId) {
			if ((ret = pthread_create (&(team->Threads [threadId].Thread), &thread_attr,_CMthreadWork,(void *) (team->Threads + threadId))) != 0) {
				CMmsgPrint (CMmsgSysError,"Thread creation returned with error [%d] in %s:%d\n",ret,__FILE__,__LINE__);
				free (team->Threads);
				free (team);
				return (CMfailed);
			}
		}
		pthread_attr_destroy(&thread_attr);
		for (threadId = 0;threadId < team->ThreadNum;++threadId) pthread_join(team->Threads [threadId].Thread, &status);
	}
	else
		for (taskId = 0;taskId < job->TaskNum; ++taskId)
			job->UserFunc (job->CommonData, job->Data, taskId);
	return (CMsucceeded);
}
Exemplo n.º 4
0
static void *_CMthreadWork (void *dataPtr) {
	CMthreadData_p data = (CMthreadData_p) dataPtr;
	size_t taskId, start, end;
	CMthreadTeam_p team = (CMthreadTeam_p) data->TeamPtr;
	CMthreadJob_p  job  = team->JobPtr;

	pthread_mutex_lock   (&(team->Mutex));
	while (job->Group < job->GroupNum) {
		pthread_mutex_unlock (&(team->Mutex));
		start = job->Groups [job->Group].Start [data->Id];
		end   = job->Groups [job->Group].End   [data->Id];
		for (taskId = start; taskId < end; taskId++) job->UserFunc (job->CommonData, job->Data [data->Id], job->SortedTasks [taskId]->Id);
		pthread_mutex_lock (&(team->Mutex));
		job->Completed++;
		if (job->Completed == team->ThreadNum) {
			job->Group++;
			job->Completed = 0;
			pthread_cond_broadcast (&(team->Cond));
		}
		else pthread_cond_wait (&(team->Cond), &(team->Mutex));
	}
	pthread_mutex_unlock (&(team->Mutex));
	pthread_exit ((void *) NULL);
}