2010-10-27 34 views
17

Tôi đã dành một chút thời gian để gỡ lỗi chương trình cung cấp lỗi phân đoạn. Lỗi này là khá không xác định và không liên tục, gây phiền nhiễu. Tôi thu hẹp nó xuống để gọi strtok. Tôi nghi ngờ rằng đó là sự kêu gọi của strtok để chia chuỗi trong hai chủ đề khác nhau gây ra lỗi phân đoạn. Tôi có thể gọi strtok trong hai chủ đề khác nhau không?strtok chức năng an toàn chủ đề

Cảm ơn.

+0

Vui lòng không gắn thẻ câu hỏi C++ khi đó thực sự là câu hỏi C. –

Trả lời

35

strtok() không phải là reentrant do đó không nên sử dụng nó từ các ứng dụng luồng, thay vào đó hãy sử dụng strtok_r().

+0

Tôi đã thử sử dụng Dev-C++ để tạo một chương trình C và strtok_r không có sẵn: (Tôi không chắc chắn về tiêu chuẩn/phiên bản/trình biên dịch devcpp nào sử dụng –

+0

Phiên bản tiêu chuẩn POSIX của strtok có thêm một con trỏ. Vì vậy, phiên bản đó là thread-safe miễn là các treads khác nhau sử dụng các con trỏ khác nhau. – Calmarius

6

strtok() không an toàn MT vì nó lưu trữ một số biến trung gian trên toàn cầu và tái sử dụng chúng ở mỗi cuộc gọi (xem bạn không phải trả lại chuỗi mỗi khi bạn gọi strtok()). Bạn có thể xem trang hướng dẫn sử dụng các phương pháp bạn đang sử dụng và nó luôn được chỉ ra ở cuối nếu nó là MT-safe hay không.

Khi phương pháp không phải là MT-an toàn (đa chủ đề an toàn hoặc reentrant), bạn nên tìm phương pháp tương tự với hậu tố _r có nghĩa là reentrand. Trong ví dụ của bạn, strtok_r() như được đề xuất trong câu trả lời khác.

Các vấn đề liên quan