軟件的功能彷佛都是以資源的管理爲主線的,各模塊都存在必定數量的資源分配和釋放操做。一個模塊在分配所須要的資源時,無一例外地存在各資源的分配順序。圖 1中的queue_init()函數中,在5八、6八、7二、77和81行分別進行了五次資源分配。當一個隊列再也不須要時,則須要調用queue_fini()函數釋放相關的資源。很重要的一點是,queue_fini()在釋放資源時,須要以逆序的方式釋放所分配得到的資源。ide
example.c
00053: int queue_init (queue_t ** _pp_queue, int _size)
00054: {
00055: pthread_mutexattr_t attr;
00056: queue_t *queue;
00057:
00058: queue = (queue_t *) malloc(sizeof(queue_t));
00059: if (0 == queue) {
00060: return -1;
00061: }
00062: *_pp_queue = queue;
00063:
00064: memset (queue, 0, sizeof (*queue));
00065: queue->size_ = _size;
00066:
00067: pthread_mutexattr_init (&attr);
00068: if (0 != pthread_mutex_init(&queue->mutex_, &attr)) {
00069: goto error1;
00070: }
00071:
00072: queue->messages_ = (void **) malloc (queue->size_ * sizeof (void *));
00073: if (0 == queue->messages_) {
00074: goto error1;
00075: }
00076:
00077: if (0 != sem_init(&queue->sem_put_, 0, queue->size_)) {
00078: goto error2;
00079: }
00080:
00081: if (0 != sem_init(&queue->sem_get_, 0, 0)) {
00082: goto error3;
00083: }
00084:
00085: pthread_mutexattr_destroy (&attr);
00086:
00087: return 0;
00088:
00089: error3:
00090: sem_destroy (&queue->sem_put_);
00091: error2:
00092: free (queue->messages_);
00093: error1:
00094: pthread_mutexattr_destroy (&attr);
00095: free (queue);
00096: return -1;
00097: }
00098:
00099: int queue_fini (queue_t ** _pp_queue, int _size)
00100: {
00101: queue_t *queue = *_pp_queue;
00102:
00103: if (0 == queue) {
00104: return -1;
00105: }
00106:
00107: sem_destroy (&queue->sem_get_);
00108: sem_destroy (&queue->sem_put_);
00109: free (queue->messages_);
00110: pthread_mutex_destroy (&queue->mutex_);
00111: free (queue);
00112: }
圖1
其實,在不少情形下,資源釋放的順序根本不重要。好比圖 1中的107和108行,其順序就不是很重要。可是109和111行的順序就很是的重要,並且,111行的釋放操做只能是在其它的資源都釋放完了後才能進行。但將以逆序的方式釋放資源做爲編成習慣,有助於避免因資源釋放順序不對所形成的問題。另外,這類問題的發生很容易形成程序崩潰。函數