some thread API examples
This commit is contained in:
21
threads-api/Makefile
Normal file
21
threads-api/Makefile
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
CC := gcc
|
||||||
|
CFLAGS := -Wall -Werror -I../include
|
||||||
|
|
||||||
|
SRCS := thread_create.c \
|
||||||
|
thread_create_simple_args.c \
|
||||||
|
thread_create_with_return_args.c
|
||||||
|
|
||||||
|
OBJS := ${SRCS:c=o}
|
||||||
|
PROGS := ${SRCS:.c=}
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
all: ${PROGS}
|
||||||
|
|
||||||
|
${PROGS} : % : %.o Makefile
|
||||||
|
${CC} $< -o $@ -pthread
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f ${PROGS} ${OBJS}
|
||||||
|
|
||||||
|
%.o: %.c Makefile
|
||||||
|
${CC} ${CFLAGS} -c $<
|
||||||
20
threads-api/README.md
Normal file
20
threads-api/README.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
# Threads API
|
||||||
|
|
||||||
|
Some simple examples of how to use POSIX thread APIs.
|
||||||
|
|
||||||
|
Relevant files:
|
||||||
|
- `thread_create.c`: A simple thread creation program, with args passed to the
|
||||||
|
thread.
|
||||||
|
- `thread_create_with_return_args.c`: Return values from the thread to the
|
||||||
|
parent.
|
||||||
|
- `thread_create_simple_args.c`: Simpler argument/return value passing for the
|
||||||
|
lazy.
|
||||||
|
|
||||||
|
Type `make` to build; each file `foo.c` generates an executable `foo` which
|
||||||
|
you can then run, e.g.:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
prompt> ./thread_create
|
||||||
|
```
|
||||||
|
|
||||||
25
threads-api/thread_create.c
Normal file
25
threads-api/thread_create.c
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int a;
|
||||||
|
int b;
|
||||||
|
} myarg_t;
|
||||||
|
|
||||||
|
void *mythread(void *arg) {
|
||||||
|
myarg_t *args = (myarg_t *) arg;
|
||||||
|
printf("%d %d\n", args->a, args->b);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
pthread_t p;
|
||||||
|
myarg_t args = { 10, 20 };
|
||||||
|
|
||||||
|
int rc = pthread_create(&p, NULL, mythread, &args);
|
||||||
|
assert(rc == 0);
|
||||||
|
(void) pthread_join(p, NULL);
|
||||||
|
printf("done\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
19
threads-api/thread_create_simple_args.c
Normal file
19
threads-api/thread_create_simple_args.c
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include "common_threads.h"
|
||||||
|
|
||||||
|
void *mythread(void *arg) {
|
||||||
|
long long int value = (long long int) arg;
|
||||||
|
printf("%lld\n", value);
|
||||||
|
return (void *) (value + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
pthread_t p;
|
||||||
|
long long int rvalue;
|
||||||
|
Pthread_create(&p, NULL, mythread, (void *) 100);
|
||||||
|
Pthread_join(p, (void **) &rvalue);
|
||||||
|
printf("returned %lld\n", rvalue);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
36
threads-api/thread_create_with_return_args.c
Normal file
36
threads-api/thread_create_with_return_args.c
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include "common_threads.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int a;
|
||||||
|
int b;
|
||||||
|
} myarg_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
} myret_t;
|
||||||
|
|
||||||
|
void *mythread(void *arg) {
|
||||||
|
myarg_t *args = (myarg_t *) arg;
|
||||||
|
printf("args %d %d\n", args->a, args->b);
|
||||||
|
myret_t *rvals = malloc(sizeof(myret_t));
|
||||||
|
assert(rvals != NULL);
|
||||||
|
rvals->x = 1;
|
||||||
|
rvals->y = 2;
|
||||||
|
return (void *) rvals;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
pthread_t p;
|
||||||
|
myret_t *rvals;
|
||||||
|
myarg_t args = { 10, 20 };
|
||||||
|
Pthread_create(&p, NULL, mythread, &args);
|
||||||
|
Pthread_join(p, (void **) &rvals);
|
||||||
|
printf("returned %d %d\n", rvals->x, rvals->y);
|
||||||
|
free(rvals);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user