A few examples
Let's take a look at some examples. We'll assume that the proper include files (<pthread.h> and <sched.h>) have been included, and that the thread to be created is called new_thread() and is correctly prototyped and defined.
The most common way of creating a thread is to simply let the values default:
pthread_create (NULL, NULL, new_thread, NULL);
In the above example, we've created our new thread with the defaults, and passed it a NULL as its one and only parameter (that's the third NULL in the pthread_create() call above).
Generally, you can pass anything you want (via the arg field) to your new thread. Here we're passing the number 123:
pthread_create (NULL, NULL, new_thread, (void *) 123);
A more complicated example is to create a non-joinable thread with round-robin scheduling at priority 15:
pthread_attr_t attr;
// initialize the attribute structure
pthread_attr_init (&attr);
// set the detach state to "detached"
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
// override the default of INHERIT_SCHED
pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED);
pthread_attr_setschedpolicy (&attr, SCHED_RR);
attr.param.sched_priority = 15;
// finally, create the thread
pthread_create (NULL, &attr, new_thread, NULL);
To see what a multithreaded program looks like,
you could run the
pidin
command from the shell.
Say our program was called spud.
If we run pidin
once before spud created a thread and once after spud
created two more threads (for three total),
here's what the output would look like (I've shortened the pidin
output to show only spud):
# pidin
pid tid name prio STATE Blocked
12301 1 spud 10r READY
# pidin
pid tid name prio STATE Blocked
12301 1 spud 10r READY
12301 2 spud 10r READY
12301 3 spud 10r READY
As you can see, the process spud (process ID 12301)
has three threads (under the tid
column).
The three threads are running at priority 10 with a scheduling
algorithm of round robin (indicated by the r
after the 10).
All three threads are READY, meaning that they're able to use CPU but aren't
currently running on the CPU (another, higher-priority thread, is currently running).
Now that we know all about creating threads, let's take a look at how and where we'd use them.
