PTHREAD_MUTEX_INITIALIZER so với pthread_mutex_init (& mutex, param)


89

Có sự khác biệt nào giữa

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Hoặc là

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

Tôi có đủ an toàn nếu chỉ sử dụng phương pháp đầu tiên không?

LƯU Ý: Câu hỏi của tôi chủ yếu đề cập đến các chương trình rất nhỏ, nơi tối đa những gì tôi sẽ làm là kết nối một số máy khách với một máy chủ và giải quyết các thắc mắc của họ bằng các chuỗi công nhân.

Câu trả lời:


72

Theo các phiên bản cũ hơn của tiêu chuẩn POSIX, phương thức đầu tiên có trình khởi tạo chỉ được đảm bảo hoạt động với các biến được cấp phát tĩnh, không phải khi biến là một autobiến được xác định trong một thân hàm. Mặc dù tôi chưa bao giờ thấy một nền tảng nào mà điều này sẽ không được phép, ngay cả đối với autocác biến và hạn chế này đã bị loại bỏ trong phiên bản mới nhất của tiêu chuẩn POSIX.

Các staticbiến thể thực sự thích hợp hơn nếu bạn có thể, vì nó cho phép để viết mã bootstrap dễ dàng hơn nhiều. Bất cứ khi nào tại thời điểm chạy, bạn nhập mã sử dụng mutex như vậy, bạn có thể yên tâm rằng mutex đã được khởi tạo. Đây là một thông tin quý giá trong bối cảnh đa luồng.

Phương pháp sử dụng hàm init sẽ thích hợp hơn khi bạn cần các thuộc tính đặc biệt cho mutex của mình, chẳng hạn như có thể đệ quy hoặc có thể chia sẻ giữa các tiến trình, không chỉ giữa các luồng.


8

Bạn có thể đặt nhiều thuộc tính hơn của mutex với khởi tạo động, ngoài ra bạn chỉ có thể sử dụng phương thức động nếu bạn đang thêm một loạt mutex vào thời gian chạy.

Tuy nhiên, không có gì sai với cách tiếp cận tĩnh, nếu điều đó phù hợp với nhu cầu của bạn.


" cộng với bạn chỉ có thể sử dụng phương thức động nếu bạn đang thêm một loạt các mutex tại thời gian chạy. " Vậy, điều này có nghĩa là gì? Một ví dụ nhỏ nếu không dễ giải thích?
Kalec

1
@Kalec: nếu mutex của bạn được cấp phát bởi malloc()(hoặc thuộc về một đối tượng được cấp phát).
Michael Burr

3
@Kalec nếu biến mutex "lock" là một phần của cấu trúc, thì chúng ta không thể làm theo cách tiếp cận thứ nhất. chúng ta phải sử dụng pthread_init ().
pankaj kushwaha

7

Tôi xin trích dẫn điều này từ cuốn sách này :

Với POSIXluồng, có hai cách để khởi tạo khóa. Một cách để làm điều này là sử dụng PTHREAD_MUTEX_INITIALIZER, như sau: pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Làm như vậy đặt khóa thành các giá trị mặc định và do đó làm cho khóa có thể sử dụng được. Cách năng động để thực hiện việc đó (tức là tại thời điểm chạy) là thực hiện cuộc gọi pthread_mutex_init()như sau: int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!

Đối số đầu tiên của quy trình này là địa chỉ của chính khóa, trong khi đối số thứ hai là một tập hợp các thuộc tính tùy chọn. Đọc thêm về các thuộc tính cho mình; truyền NULL vào chỉ cần sử dụng các giá trị mặc định. Cách nào cũng hoạt động , nhưng chúng tôi thường sử dụng phương thức động (sau).


4

Trong trường hợp các thuộc tính mutex mặc định là phù hợp, macro PTHREAD_MUTEX_INITIALIZER có thể được sử dụng để khởi tạo mutex.

Nếu bạn muốn chỉ định các thuộc tính cho mutex, hãy khởi tạo động ........

Hiệu ứng này sẽ tương đương với khởi tạo động bằng lệnh gọi đến pthread_mutex_init () với tham số được chỉ định là NULL, ngoại trừ việc không có kiểm tra lỗi nào được thực hiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.