📄 100.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>123</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="54.htm">上一层</a>][<a href="101.htm">下一篇</a>]
<hr><p align="left"><small>发信人: clown (梧桐叶), 信区: UNP <br>
标 题: 多线程访问互斥的程序 <br>
发信站: UNIX编程 (2001年10月11日22:15:54 星期四), 站内信件 <br>
<br>
//一个线程建立链表节点,三个线程取走链表节点中的数据,然后删掉该节点。 <br>
//one thread put the data into a link tabel <br>
//three threads get the data from the link table and remove the node <br>
<br>
#include <pthread.h> <br>
#include <errno.h> <br>
#include <time.h> <br>
#include <stdio.h> <br>
#include <stdlib.h> <br>
#include <unistd.h> <br>
<br>
#define MAX_THREAD 3 <br>
#define MAX_TIME 1000 //nanosecond <br>
<br>
struct link { <br>
int number; <br>
struct link *next; <br>
}; <br>
struct link *head = NULL; <br>
struct link *last = NULL; <br>
<br>
//pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; <br>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; <br>
pthread_mutex_t mutex_done = PTHREAD_MUTEX_INITIALIZER; <br>
pthread_cond_t cond_var = PTHREAD_COND_INITIALIZER; <br>
<br>
int requests = 0; //how many node created <br>
int done = 0; //the thread should exit? <br>
<br>
void add_node(int number, pthread_mutex_t *pmutex, pthread_cond_t *pcond) <br>
{ <br>
pthread_t tid; <br>
struct link *p; <br>
<br>
p = (struct link *)malloc(sizeof(struct link)); <br>
if(p == NULL) { <br>
printf("malloc failed, out of memory.\n"); <br>
exit(1); <br>
} <br>
p->number = number; <br>
p->next = NULL; <br>
tid = pthread_self(); <br>
<br>
if(pthread_mutex_lock(pmutex) == 0) { <br>
//lock succeed <br>
if(head == NULL) { <br>
head = last = p; <br>
} else { <br>
last->next = p; <br>
last = p; <br>
} <br>
requests++; <br>
printf("Thread %d, add node number %d\n", tid, number); <br>
//fflush(stdout); <br>
//unlock <br>
pthread_mutex_unlock(pmutex); <br>
//communication with the other thread <br>
pthread_cond_signal(pcond); <br>
} else { <br>
perror("lock failed in add_node"); <br>
} <br>
} <br>
<br>
<br>
void del_node(pthread_mutex_t *pmutex) <br>
{ <br>
pthread_t tid; <br>
struct link *p; <br>
if(requests > 0) { <br>
p = head; <br>
head = head->next; <br>
if(head == NULL) <br>
last = NULL; <br>
requests--; <br>
tid = pthread_self(); <br>
printf("Thread %d, del node number %d\n", tid, p->number); <br>
//fflush(stdout); <br>
free(p); <br>
} <br>
} <br>
<br>
void *handle_loop() <br>
{ <br>
if(pthread_mutex_lock(&mutex) != 0) { <br>
perror("lock failed in handle_loop"); <br>
return; <br>
} <br>
while(1) { <br>
if(requests > 0) { <br>
del_node(&mutex); <br>
} else { <br>
//unlock->wait->node create->lock->return <br>
pthread_cond_wait(&cond_var, &mutex); <br>
} <br>
pthread_mutex_lock(&mutex_done); <br>
if(done) { <br>
pthread_mutex_unlock(&mutex_done); <br>
pthread_mutex_unlock(&mutex); <br>
break; <br>
} <br>
pthread_mutex_unlock(&mutex_done); <br>
<br>
} <br>
return; <br>
} <br>
<br>
int main() <br>
{ <br>
{ <br>
int i, random; <br>
struct timespec delay; <br>
pthread_t tid[MAX_THREAD]; <br>
void *ret; <br>
<br>
//create the threads to get the data in link table <br>
for(i=0; i<MAX_THREAD; i++) <br>
pthread_create(&tid[i], NULL, handle_loop, NULL); <br>
<br>
for(i=0; i<30; i++) { <br>
add_node(i, &mutex, &cond_var); <br>
srand(time(NULL)); <br>
random = rand() % MAX_TIME; <br>
delay.tv_sec = 0; <br>
delay.tv_nsec = random; <br>
nanosleep(&delay, NULL); <br>
} <br>
<br>
//wait the threads which is deleting the node in link table <br>
pthread_mutex_lock(&mutex_done); <br>
done = 1; <br>
pthread_mutex_unlock(&mutex_done); <br>
pthread_cond_broadcast(&cond_var); <br>
for(i=0; i<MAX_THREAD; i++) { <br>
if(pthread_join(tid[i], &ret) == 0) { <br>
printf("tid[%d] = %d, return!\n", i, tid[i]); <br>
} else { <br>
perror("pthread_jion"); <br>
break; <br>
} <br>
} <br>
<br>
printf("all done\n"); <br>
return 0; <br>
} <br>
<br>
<br>
结果: <br>
Thread 1024, add node number 0 <br>
Thread 1026, del node number 0 <br>
Thread 1024, add node number 1 <br>
Thread 2051, del node number 1 <br>
Thread 1024, add node number 2 <br>
Thread 3076, del node number 2 <br>
Thread 1024, add node number 3 <br>
Thread 1026, del node number 3 <br>
Thread 1024, add node number 4 <br>
Thread 2051, del node number 4 <br>
Thread 1024, add node number 5 <br>
Thread 3076, del node number 5 <br>
Thread 1024, add node number 6 <br>
Thread 1026, del node number 6 <br>
Thread 1024, add node number 7 <br>
Thread 2051, del node number 7 <br>
Thread 1024, add node number 8 <br>
Thread 3076, del node number 8 <br>
Thread 1024, add node number 9 <br>
Thread 1026, del node number 9 <br>
Thread 1024, add node number 10 <br>
Thread 2051, del node number 10 <br>
Thread 1024, add node number 11 <br>
Thread 3076, del node number 11 <br>
Thread 1024, add node number 12 <br>
Thread 1026, del node number 12 <br>
Thread 1024, add node number 13 <br>
Thread 2051, del node number 13 <br>
Thread 1024, add node number 14 <br>
Thread 3076, del node number 14 <br>
Thread 1024, add node number 15 <br>
Thread 1026, del node number 15 <br>
Thread 1024, add node number 16 <br>
Thread 2051, del node number 16 <br>
Thread 1024, add node number 17 <br>
Thread 3076, del node number 17 <br>
Thread 1024, add node number 18 <br>
Thread 1026, del node number 18 <br>
Thread 1024, add node number 19 <br>
Thread 2051, del node number 19 <br>
Thread 1024, add node number 20 <br>
Thread 3076, del node number 20 <br>
Thread 1024, add node number 21 <br>
Thread 1026, del node number 21 <br>
Thread 1024, add node number 22 <br>
Thread 2051, del node number 22 <br>
Thread 1024, add node number 23 <br>
Thread 3076, del node number 23 <br>
Thread 1024, add node number 24 <br>
Thread 1026, del node number 24 <br>
Thread 1024, add node number 25 <br>
Thread 2051, del node number 25 <br>
Thread 1024, add node number 26 <br>
Thread 3076, del node number 26 <br>
Thread 1024, add node number 27 <br>
Thread 1026, del node number 27 <br>
Thread 1024, add node number 28 <br>
Thread 2051, del node number 28 <br>
Thread 1024, add node number 29 <br>
Thread 3076, del node number 29 <br>
tid[0] = 1026, return! <br>
tid[1] = 2051, return! <br>
tid[2] = 3076, return! <br>
all done <br>
<br>
<br>
<br>
-- <br>
易朽的是生命,似那转瞬即谢的花朵;然而永存的,是对未来的渴望, <br>
是那生生世世传递下来的,不朽的,生的激情。每一朵勇敢开放的花, <br>
都是一个死亡唇边的微笑。 <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.1.61] <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="54.htm">上一层</a>][<a href="101.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -