多進程
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t child_pid;
/* 創建一個子進程 */
child_pid = fork();
if(child_pid == 0)
{
sleep(2);
printf("child pid\n");
}
else
{
sleep(1);
printf("father pid\n");
}
return 0;
}
pid_t是進程號,是唯一表示進程的ID。
pid_t fork(void) 函數
包含的頭文件:
#include <sys/types.h>
#include <unistd.h>
調用fork可以創建一個全新的進程。這個系統調用對當前進程進行復制。在進程表裏創建一個新的項目,新項目的許多屬性與當前進程是相同的。新進程和原進程幾乎一模一樣,執行的也是相同的代碼,但新進程有自己的數據空間、自己的環境等。
程序調用了fork函數的時候被分成了兩個進程。在父進程裏,fork函數返回新進程的PID進程號,新進程則返回0,這個可以做爲區分父子進程的依據。
多線程
參數聲明
int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,
(void*)(*start_rtn)(void*),void *arg);
thread並非Linux系統的默認庫,而是POSIX線程庫。在Linux中將其作爲一個庫來使用,因此加上 -lpthread,若線程創建成功,則返回0。若線程創建失敗,則返回出錯編號,並且*thread中的內容是未定義的。
返回成功時,由tidp指向的內存單元被設置爲新創建線程的線程ID。attr參數用於指定各種不同的線程屬性。新創建的線程從start_rtn函數的地址開始運行,該函數只有一個萬能指針參數arg,如果需要向start_rtn函數傳遞的參數不止一個,那麼需要把這些參數放到一個結構中,然後把這個結構的地址作爲arg的參數傳入。
#include <stdio.h>
#include <pthread.h>
struct char_print_params
{
char character;
int count;
};
void *char_print(void *parameters)
{
struct char_print_params *p = (struct char_print_params *)parameters;
int i;
for(i = 0; i < p->count; i++)
{
sleep(1);
printf("\n");
fputc(p->character,stderr);
}
return NULL;
}
int main()
{
pthread_t thread1_id;
pthread_t thread2_id;
struct char_print_params thread1_args;
struct char_print_params thread2_args;
thread1_args.character = 'x';
thread1_args.count = 10;
pthread_create(&thread1_id, NULL, &char_print, &thread1_args);
thread2_args.character = 'o';
thread2_args.count = 10;
pthread_create(&thread2_id, NULL, &char_print, &thread2_args);
pthread_join(thread1_id, NULL);
pthread_join(thread2_id, NULL);
printf("main thread\r\n");
return 0;
}
線程同步與互斥
互斥
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);
/*也可以用下面的方式初始化*/
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&mutex);
/* 互斥 */
thread_flag = value;
pthread_mutex_unlock(&mutex);
條件變量
int thread_flag = 0;
pthread_mutex_t mutex;
pthread_cond_t thread_flag_cv;
void init_flag()
{
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&thread_flag_cv, NULL);
thread_flag = 0;
}
void *thread_function(void *thread_flag)
{
while(1)
{
pthread_mutex_lock(&mutex);
while(thread_flag != 0 )
{
pthread_cond_wait(&thread_flag_cv, &mutex);
}
pthread_mutex_unlock(&mutex);
do_work();
}
return NULL;
}
void set_thread_flag(int flag_value)
{
pthread_mutex_lock(&mutex);
thread_flag = flag_value;
pthread_cond_signal(&thread_flag_cv);
pthread_mutex_unlock(&mutex);
}