?? linux多線程程序設計.txt
字號:
Linux多線程程序設計,(網絡上流傳的一道題)
有四個線程1,2,3,4,線程1的功能就是輸出1,線程2的功能就是輸出2,以此類推.....
現在有四個文件.ABCD.初始都為空.
現要讓四個文件呈如下格式:
A: 1 2 3 4 1 2....
B: 2 3 4 1 2 3....
C: 3 4 1 2 3 4....
D: 4 1 2 3 4 1....
設計程序.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#include <unistd.h> //usleep ,sleep
#define MY_THREAD_COUNT 4
#define MY_LOOP_COUNT 3
typedef struct
...{
int loops; //表示要循環寫入文件的次數
int fd;
int curData; //當前要寫入文件的數字
pthread_mutex_t mutex;
}FILENODE,*LPFILENODE;
char *filenames[] = ...{"a.txt","b.txt","c.txt","d.txt"};
pthread_t pids[MY_THREAD_COUNT];
FILENODE filenodes[MY_THREAD_COUNT];
bool IsCompleted()
...{
for(int i = 0; i < MY_THREAD_COUNT; i++)
...{
if(filenodes[i].loops != MY_LOOP_COUNT)
return false;
}
return true;
}
void* ThreadFunc(void* para)
...{
int num = *(int*)para;
printf("Loop thread id: %d ",num);
char buf[50] = ...{""};
bool bExit = false;
while(!bExit)
...{
if(IsCompleted())
break;
printf("thread id : %d begin loops files ",num);
for(int i = 0; i < MY_THREAD_COUNT; i++)
...{
int rtn = pthread_mutex_trylock(&filenodes[i].mutex);
if(rtn == 0)
...{
if(filenodes[i].loops >= MY_LOOP_COUNT)
...{
pthread_mutex_unlock(&filenodes[i].mutex);
continue;
}
if(filenodes[i].curData == num)
...{
sprintf(buf,"%d:%d",num,filenodes[i].curData);
write(filenodes[i].fd,buf,strlen(buf));
filenodes[i].curData += 1;
}
if(filenodes[i].curData > 4)
...{
filenodes[i].curData = 1;
filenodes[i].loops++;
}
pthread_mutex_unlock(&filenodes[i].mutex);
}
}
usleep(500000);
}
printf("thread id : %d, succeed exit! ",num);
free(para);
}
int main()
...{
int i = 0;
for(i = 0;i<MY_THREAD_COUNT;i++)
...{
filenodes[i].fd = open(filenames[i],O_CREAT|O_WRONLY,S_IRUSR|S_IWUSR);
filenodes[i].loops = 0;
filenodes[i].curData = i+1;
int rtn = pthread_mutex_init(&filenodes[i].mutex,NULL);
int* para = (int*)malloc(sizeof(int));
*para = i+1;
rtn = pthread_create(&pids[i],NULL,ThreadFunc,para);
}
for(i = 0;i<MY_THREAD_COUNT;i++)
...{
pthread_join(pids[i],NULL);
}
for(int i = 0; i < MY_THREAD_COUNT;i++)
...{
if(!filenodes[i].fd)
...{
close(filenodes[i].fd);
}
}
return 0;
}
通過Shell>: g++ -g -o Threads main.C -lpthread
生成可執行文件Threads,執行可執行文件后就可以查看結果。對于上面的題目,我做了一個擴沖,就是設定了循環的次數。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -