sách gpt4 ăn đã đi

Tóm tắt các phương pháp thoát luồng Linux (được khuyến nghị)

In lại Tác giả: qq735679552 Thời gian cập nhật: 27-09-2022 22:32:09 42 4
mua khóa gpt4 giày nike

CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.

Bài viết trên blog CFSDN Tóm tắt các phương pháp thoát luồng Linux (Được khuyến nghị) này được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm đến bài viết này thì nhớ like nhé.

Khi viết mã đa luồng, chúng ta thường gặp phải vấn đề thoát thread-safe.

Nói chung, chọn cách kiểm tra cờ:

Trong vòng lặp while của luồng, sau khi thủ tục được thực thi, bit cờ sẽ được kiểm tra. Nếu bit cờ cho biết việc thực hiện tiếp tục thì thủ tục sẽ được thực thi lại. Nếu bit cờ được đặt ở trạng thái thoát, vòng lặp sẽ được nhảy ra ngoài. và chủ đề được chấm dứt.

Cờ này cần được đặt bởi luồng chính (hoặc các luồng khác). Sau khi thiết lập, luồng chính gọi giao diện pthread_join để chuyển sang chế độ ngủ (tham số giao diện chỉ định con trỏ điều khiển luồng đang chờ). thread sẽ nhận được tín hiệu từ hệ thống Sau khi tiếp tục từ chế độ ngủ đông, bạn có thể thực hiện các hành động xóa tài nguyên liên quan vào lúc này.

Phương pháp này có thể đảm bảo rằng luồng con thoát hoàn toàn và luồng chính sau đó thực hiện các hoạt động xóa tài nguyên liên quan.

Sơ đồ thời gian như sau.

Tóm tắt các phương pháp thoát luồng Linux (được khuyến nghị)

Tuy nhiên, trong một số ứng dụng, các tình huống sau có thể xảy ra:

Luồng con bị chặn trong một thao tác nhất định và không thể được đánh thức. Ngay cả khi luồng chính đặt bit cờ, vì luồng con chuyển sang chế độ ngủ và không thể thức dậy nên không có cách nào để kiểm tra bit cờ. luồng chính gọi pthread_join để chuyển sang chế độ ngủ không thể đợi luồng con. Tín hiệu cho thấy luồng thoát cũng sẽ không hoạt động và hệ thống sẽ rơi vào tình trạng bế tắc.

Để thoát khỏi luồng an toàn hơn, luồng chính yêu cầu hủy các luồng khác trong cùng tiến trình thông qua hàm pthread_cancel, sau đó gọi pthread_join để đợi luồng được chỉ định thoát ra. Để sử dụng giao diện pthread_cancel, bạn cần hiểu hai thuộc tính của luồng trong Linux, trạng thái có thể hủy và loại có thể hủy cũng như khái niệm về điểm hủy.

Trạng thái có thể hủy: bao gồm pthread_cancel_enable và pthread_cancel_disable. Khi một thread ở trạng thái pthread_cancel_enable, việc nhận được yêu cầu hủy sẽ khiến thread thoát ra; ngược lại, nếu nó ở trạng thái pthread_cancel_disable thì yêu cầu hủy nhận được sẽ ở trạng thái chờ xử lý và thread sẽ không thoát ra. Trạng thái có thể hủy mặc định khi một luồng được bắt đầu là pthread_cancel_enable và các thuộc tính của trạng thái có thể hủy có thể được thay đổi thông qua giao diện pthread_setcancelstate.

Các loại có thể hủy: bao gồm pthread_cancel_deferred và pthread_cancel_asynchronous. Khi nó ở pthread_cancel_deferred, sau khi nhận được yêu cầu hủy, luồng cần chạy đến điểm hủy trước khi thoát; nếu nó ở pthread_cancel_asynchronous thì có thể bị hủy bất cứ lúc nào và nó có thể thoát ngay lập tức miễn là nhận được lệnh hủy. lời yêu cầu. Loại có thể hủy mặc định khi một luồng bắt đầu là pthread_cancel_deferred, có thể được sửa đổi thông qua pthread_setcanceltype.

Điểm hủy: Điểm mà luồng kiểm tra xem nó đã bị hủy hay chưa và thực hiện hành động theo yêu cầu.

Phương thức hủy pthread_cancel_deferred được sử dụng vì luồng có thể nhận được tín hiệu thoát sau khi lấy được các tài nguyên quan trọng (chẳng hạn như lấy khóa) trước khi giải phóng tài nguyên. Nếu sử dụng phương thức pthread_cancel_asynchronous, bất kể luồng chạy ở đâu, nó sẽ thoát ngay lập tức và. tài nguyên bị chiếm đóng Nhưng anh ta không thể được giải phóng.

Sử dụng phương thức hủy pthread_cancel_deferred, thread cần chạy đến điểm hủy trước khi thoát. Tuy nhiên, sau khi gọi pthread_cancel, thread chính không thể giải phóng tài nguyên thread ngay lập tức.

Việc sử dụng phương pháp pthread_cancel_deferred không thể tránh hoàn toàn vấn đề này, vì không có gì đảm bảo rằng sau khi có được các tài nguyên quan trọng (chẳng hạn như thao tác khóa), các thao tác có thể được sử dụng làm điểm hủy (chẳng hạn như chế độ ngủ) sẽ không được thực hiện tại thời điểm này. nếu main thread gửi tín hiệu cancel tới thread, Thread sẽ kết thúc chạy trực tiếp mà không nhả khóa, tức là vấn đề thread thoát trước khi giải phóng tài nguyên vẫn xảy ra.

Để tránh tình trạng trên, không chỉ cần đặt loại có thể hủy mà còn cần đặt trạng thái có thể hủy. Đặt các khối mã giữa việc thu thập các tài nguyên quan trọng và giải phóng các tài nguyên quan trọng sang trạng thái pthread_cancel_disable, đồng thời đặt các khối mã còn lại ở trạng thái pthread_cancel_enable để đảm bảo rằng luồng thoát ra ở nơi an toàn. Nếu không có lệnh gọi hệ thống điểm hủy trong khối mã có thể thoát ra an toàn, bạn có thể gọi hàm pthread_testcancel để tự thêm điểm hủy.

Mã giả được mô tả như sau:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void* luồng con(void*)
{
   pthread_setcancelstate(pthread_cancel_enable,&oldcanclestate);
   …;//Không có khối mã nào có thể lấy được tài nguyên quan trọng và có thể thoát ra một cách an toàn.
   pthread_testcancel();//Nếu khối mã có thể thoát an toàn không có thao tác điểm hủy, bạn có thể tự thêm lệnh gọi pthread_testcancel và luồng sẽ thoát sau khi thực hiện lệnh gọi này.
   /*Có một phương thức khác. Trong khối mã có thể thoát ra an toàn, chúng ta đặt loại thread có thể hủy là pthread_cancel_asynchronous, để có thể thoát ngay lập tức ngay cả khi không có điểm hủy*/
 
   pthread_setcancelstate(pthread_cancel_disable,&oldcanclestate);
   /*Có một hoạt động tài nguyên quan trọng giải phóng thu được trong quá trình thao tác giữa khóa và mở khóa và trạng thái có thể hủy được bật thì khóa không bao giờ có thể được giải phóng*/
   khóa();
   …;
   mở khóa();
}
 
void* luồng chính(void*)
{
   pthread_cancel(subthread);//Gửi tín hiệu thoát tới subthread
   pthread_join(subthread,null);//Vào chế độ ngủ cho đến khi thoát khỏi luồng con thành công
}

Cho dù sử dụng phương pháp nào, điểm cốt lõi là đảm bảo rằng một số tài nguyên quan trọng nhất định sẽ không bị thu thập và không thể giải phóng khi luồng thoát.

Các điểm hủy được xác định bởi posix.1 như sau:

Lưu ý: Khi luồng chính gọi giao diện pthread_cancel, nó chỉ gửi yêu cầu hủy đến luồng được chỉ định. Việc gọi thành công tới giao diện không đảm bảo rằng luồng được chỉ định đã thoát. Bạn cần gọi pthread_join để đợi luồng được chỉ định. thoát hoàn toàn trước khi giải phóng các tài nguyên liên quan.

Trên đây là phần tóm tắt (gợi ý) các phương pháp thoát thread Linux do editor mang đến cho các bạn. Mong các bạn ủng hộ nhé~.

Cuối cùng, bài viết này về bản tóm tắt (được khuyến nghị) về các phương pháp thoát luồng Linux kết thúc ở đây. Nếu bạn muốn biết thêm về bản tóm tắt (được khuyến nghị) về các phương thức thoát luồng Linux, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục duyệt qua các bài viết liên quan. tất cả các bạn hãy ủng hộ blog của tôi trong tương lai! .

42 4 0
qq735679552
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress