Skip to content

Instantly share code, notes, and snippets.

@ericxyan
Last active November 26, 2016 20:27
Show Gist options
  • Save ericxyan/f14e880bc1bd6c5fd88ca0c649cb3d0e to your computer and use it in GitHub Desktop.
Save ericxyan/f14e880bc1bd6c5fd88ca0c649cb3d0e to your computer and use it in GitHub Desktop.
int main (int argc, char * argv[])
{
/* Method 1 */
if (argc >= 2) {
nthreads = atoi(argv[1]);
}
if (argc >= 3) {
niterations = atoi(argv[2]);
}
if (argc >= 4) {
nobjects = atoi(argv[3]);
}
if (argc >= 5) {
work = atoi(argv[4]);
}
ericxyan/frontend-maven-plugin
if (argc >= 6) {
size = atoi(argv[5]);
}
printf ("Running threadtest for %d threads, %d iterations, %d objects, %d work and %d size...\n", nthreads, niterations, nobjects, work, size);
/* Method 2 */
static void usage(char **argv)
{
printf("usage: %s -h <mserver host name> -p <mserver port> [-f <operations file> -l <log file>]\n", argv[0]);
printf("If the operations file (-f) is not specified, the input is read from stdin\n");
printf("If the log file (-l) is not specified, log output is written to stdout\n");
}
// Returns false if the arguments are invalid
static bool parse_args(int argc, char **argv)
{
char option;
while ((option = getopt(argc, argv, "h:p:f:l:")) != -1) {
switch(option) {
case 'h': strncpy(mserver_host_name, optarg, HOST_NAME_MAX); break;
case 'p': mserver_port = atoi(optarg); break;
case 'f': strncpy(ops_file_name, optarg, PATH_MAX); break;
case 'l': strncpy(log_file_name, optarg, PATH_MAX); break;
default:
fprintf(stderr, "Invalid option: -%c\n", option);
return false;
}
}
return (mserver_host_name[0] != '\0') && (mserver_port != 0);
}
}
/*
The program below creates a thread and then uses clock_gettime(2) to
retrieve the total process CPU time, and the per-thread CPU time
consumed by the two threads. The following shell session shows an
example run:
$ ./a.out
Main thread sleeping
Subthread starting infinite loop
Main thread consuming some CPU time...
Process total CPU time: 1.368
Main thread CPU time: 0.376
Subthread CPU time: 0.992
Program source
*/
/* Link with "-lrt" */
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <errno.h>
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
#define handle_error_en(en, msg) \
do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
static void *
thread_start(void *arg)
{
printf("Subthread starting infinite loop\n");
for (;;)
continue;
}
static void
pclock(char *msg, clockid_t cid)
{
struct timespec ts;
printf("%s", msg);
if (clock_gettime(cid, &ts) == -1)
handle_error("clock_gettime");
printf("%4ld.%03ld\n", ts.tv_sec, ts.tv_nsec / 1000000);
}
int
main(int argc, char *argv[])
{
pthread_t thread;
clockid_t cid;
int j, s;
s = pthread_create(&thread, NULL, thread_start, NULL);
if (s != 0)
handle_error_en(s, "pthread_create");
printf("Main thread sleeping\n");
sleep(1);
printf("Main thread consuming some CPU time...\n");
for (j = 0; j < 2000000; j++)
getppid();
pclock("Process total CPU time: ", CLOCK_PROCESS_CPUTIME_ID);
s = pthread_getcpuclockid(pthread_self(), &cid);
if (s != 0)
handle_error_en(s, "pthread_getcpuclockid");
pclock("Main thread CPU time: ", cid);
/* The preceding 4 lines of code could have been replaced by:
pclock("Main thread CPU time: ", CLOCK_THREAD_CPUTIME_ID); */
s = pthread_getcpuclockid(thread, &cid);
if (s != 0)
handle_error_en(s, "pthread_getcpuclockid");
pclock("Subthread CPU time: 1 ", cid);
exit(EXIT_SUCCESS); /* Terminates both threads */
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment