一、创建一个多线程
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
void* ThreadFun(void* arg);
char message[] = "helloworld";
int main()
{
int res;
pthread_t a_thread;
void* thread_result;
res = pthread_create(&a_thread, NULL, ThreadFun, (void *)message);
if (res != 0)
{
perror("Thread creation failed");
exit(1);
}
printf("Waiting for thread to finish...\n");
res = pthread_join(a_thread, &thread_result);
if (res != 0)
{
perror("Thread join failed");
exit(1);
}
printf("Thread joined, it returned %s\n", (char *)thread_result);
printf("Message is now %s\n", message);
return 0;
}
void* ThreadFun(void* arg)
{
printf("Thread fun is running, Argument is %s\n", (char*)message);
sleep(15);
strcpy(message, "Bye!");
printf("Thread fun end\n");
pthread_exit("Thank you for the cpu time.");
}
二、创建多个线程示例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
void* ThreadFun1(void* arg)
{
printf("ThreadFun1 is running\n");
sleep(3);
pthread_exit("ThreadFun exit");
}
void* ThreadFun2(void* arg)
{
printf("ThreadFun2 is running\n");
sleep(1);
pthread_exit("ThreadFun exit");
}
int main()
{
pthread_t thread;
void* result;
int res = 0;
res = pthread_create(&thread, NULL, ThreadFun1, NULL);
res = pthread_create(&thread, NULL, ThreadFun2, NULL);
pthread_join(thread, &result);
printf("main end\n");
return 0;
}
三、信号量
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <semaphore.h>
void *thread_function(void *arg);
sem_t bin_sem;
#define WORK_SIZE 1024
char work_area[WORK_SIZE];
int main()
{
int res;
pthread_t a_thread;
void *thread_result;
res = sem_init(&bin_sem, 0, 0);
if (res != 0)
{
perror("semaphore initialization failed");
exit(1);
}
res = pthread_create(&a_thread, NULL, thread_function, NULL);
if (res != 0)
{
perror("Thread creation failed");
exit(1);
}
printf("Input some text.Enter 'end' to finish\n");
while (strncmp("end", work_area, 3) != 0)
{
fgets(work_area, WORK_SIZE, stdin);
sem_post(&bin_sem);
}
res = pthread_join(a_thread, &thread_result);
if (res != 0)
{
perror("Thread join failed");
exit(1);
}
printf("Tread joined\n");
sem_destroy(&bin_sem);
return 0;
}
void *thread_function(void *arg)
{
sem_wait(&bin_sem);
printf("Thread is running\n");
//pthread_exit(NULL);
return NULL;
}
四、互斥对象
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#include <stdlib.h>
void *thread_function(void *arg);
pthread_mutex_t work_mutex;
#define WORK_SIZE 1024
char work_area[WORK_SIZE];
int time_to_exit = 0;
int main()
{
int res;
pthread_t a_thread;
void *thread_result;
res = pthread_mutex_init(&work_mutex, NULL);
if (res != 0)
{
perror("Mutex initialization failed");
exit(1);
}
pthread_mutex_lock(&work_mutex);
res = pthread_create(&a_thread, NULL, thread_function, (void *)"arg");
printf("pthread_create\n");
getchar();
pthread_mutex_unlock(&work_mutex);
pthread_join(a_thread, thread_result);
pthread_mutex_destroy(&work_mutex);
return 0;
}
void *thread_function(void *arg)
{
pthread_mutex_lock(&work_mutex);
printf("get mutex lock\n");
pthread_mutex_unlock(&work_mutex);
printf("thread end.");
}
总结:
相对来说,linux多线程编程比windows接口要简洁和友好,原理都差不多