📄 once.c
字号:
/********************************************************
* An example source module to accompany...
*
* "Using POSIX Threads: Programming with Pthreads"
* by Brad nichols, Dick Buttlar, Jackie Farrell
* O'Reilly & Associates, Inc.
*
********************************************************
* once_exam.c
*
* An example of using the pthreads_once() call to execute an
* initialization procedure.
*
* A program spawns multiple threads and each one tries to
* execute the routine welcome() using the once call. Only
* the first thread into the once routine will actually
* execute welcome().
*
* The program's main thread synchronizes its exit with the
* exit of the threads using the pthread_join() operation.
*
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <pthread.h>
#define NUM_THREADS 10
static pthread_once_t welcome_once_block = PTHREAD_ONCE_INIT;
void welcome(void)
{
printf("welcome: Welcome\n");
}
void *identify_yourself(void *arg)
{
int *pid=(int *)arg;
int rtn;
if ((rtn = pthread_once(&welcome_once_block, welcome)) != 0)
{
fprintf(stderr, "pthread_once failed with %d",rtn);
pthread_exit((void *)NULL);
}
printf("identify_yourself: Hi, I'm thread # %d\n",*pid);
return(NULL);
}
extern int main(void)
{
int *id_arg, thread_num, rtn;
pthread_t threads[NUM_THREADS];
id_arg = (int *)malloc(NUM_THREADS*sizeof(int));
for (thread_num = 0; thread_num < NUM_THREADS; (thread_num)++)
{
id_arg[thread_num] = thread_num;
if (( rtn = pthread_create(&threads[thread_num], NULL, identify_yourself, (void *) &(id_arg[thread_num]))) != 0)
{
fprintf(stderr, "pthread_create failed with %d",rtn);
exit(1);
}
}
for (thread_num = 0; thread_num < NUM_THREADS; thread_num++)
{
pthread_join(threads[thread_num], NULL);
printf("main: joined to thread %d\n", thread_num);
}
free(id_arg);
printf("main: Goodbye\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -