2009-04-21 32 views
5

Trong bản sao của tôi C Programming Language (aka: K & R), có vẻ như không đề cập đến đa luồng. Cuốn sách có đầy đủ hơn tôi tưởng tượng không? Đa luồng có xuất hiện sau khi nó được viết không? Tôi đang nghĩ về điều này một cách sai lầm?C đa luồng nguồn gốc

Khái niệm đa luồng phù hợp với thế giới C ở đâu?


Edit: Tôi nghĩ rằng câu hỏi ban đầu của tôi đã được:

  • bạn có thể viết bất cứ điều gì trong C
  • tồn đa luồng
  • bạn không thể viết đa luồng trong C <-logic mâu thuẫn

Tài khoản nào có mâu thuẫn này? Nguồn gốc của đa luồng? Nếu POSIX, thì POSIX được viết bằng gì nếu không phải C? Một hình thức lắp ráp mà không thể tiếp cận với C?

+0

Đa luồng không phải là một phần của ngôn ngữ C. Nó có thể được thêm vào bởi các thư viện của bên thứ ba, tất nhiên, nhưng bản thân ngôn ngữ C không có khái niệm về luồng. – jalf

+0

@ jalf thực sự có luồng trong tiêu chuẩn C11, họ đã phải thêm nó để họ có thể xác định mô hình bộ nhớ, nhưng hầu hết các công cụ hỗ trợ vẫn còn trong thư viện chuẩn. – Spudd86

+0

Lưu ý rằng nhận xét của tôi là từ năm 2009;) – jalf

Trả lời

14

C là ngôn ngữ cấp độ khá thấp. Hỗ trợ cho các chủ đề trong một chương trình C điển hình đến từ hệ điều hành, không phải từ thời gian chạy C - nếu môi trường của bạn không hỗ trợ chủ đề, thì bạn sẽ phải tự thực hiện chúng, tìm thư viện thực hiện hoặc không có chủ đề. Điều này trái ngược với một ngôn ngữ như Java, nơi môi trường thời gian chạy cung cấp nhiều dịch vụ được đảm bảo có sẵn cho các chương trình Java có hay không hệ điều hành bên dưới hỗ trợ chúng theo cách mà nền tảng Java hiển thị.

Bây giờ, có nói rằng, tôi khá chắc chắn rằng khi ấn bản đầu tiên của K & R đã được xuất bản, Unix không hỗ trợ chủ đề. Vì C lần đầu tiên được triển khai như một ngôn ngữ hệ thống cho môi trường Unix, nên không có gì đáng ngạc nhiên khi nó không có hỗ trợ luồng gốc.

Nếu bạn đang viết mã cho một Unix như môi trường, tìm kiếm chủ đề POSIX nếu bạn cần một API cũng hỗ trợ cho việc thực hiện chương trình đa luồng trong C.

4

Cuốn sách này là hoàn tất. C có khả năng chạy các luồng, nhưng chỉ với sự hỗ trợ từ thời gian chạy nó nằm trên đó. C không hỗ trợ nhiều thứ nguyên bản. Ví dụ, nếu bạn muốn mở một tập tin hoặc lấy đầu vào từ chuột, bạn sẽ cần một thư viện cung cấp cho bạn sự hỗ trợ đó. Điều này là tốt trong một cách vì nó có nghĩa là C có thể chạy trên một máy tính nhúng nhỏ và không cần nhiều bộ nhớ cho các tính năng bạn có thể hoặc có thể không muốn.

Multithreading là khoảng cách trước khi C. (Đó là theo này: http://www.cs.clemson.edu/~mark/multithreading.html)

Bạn cần một thư viện luồng. Ví dụ: trên cửa sổ, bạn có thể:

#include "Windows.h" 

int main() 
{ 
    CreateThread(/*Google the function for details of the parameters.*/); 
    return 0; 
} 

Bạn cần tải xuống nền tảng SDK để làm điều đó. Hầu hết các nền tảng có một số loại sdk mà sẽ có một thư viện với một số chức năng để tạo chủ đề. Hầu hết có một chức năng phong cách CreateThread, nơi bạn vượt qua trong địa chỉ của một chức năng mà bạn muốn các chủ đề mới bắt đầu để bắt đầu chạy song song với chủ đề hiện tại của bạn mà bắt đầu vào chức năng chính.

Thư viện luồng được chuẩn hóa mà bạn có thể muốn tìm kiếm là posix.

3

Nếu tôi nhớ chính xác, đa luồng thực sự được sử dụng phổ biến sau này nhiều hơn ngôn ngữ lập trình C. Thư viện POSIX Threads là cách điển hình để thực hiện đa luồng trong một chương trình Unix/Linux và không phải là một phần của thư viện chuẩn.

+0

Điều tuyệt vời về tiêu chuẩn là có rất nhiều lựa chọn. Các luồng không thuộc ISO C (ISO/IEC 9899: 1999); Các chủ đề POSIX là một phần của POSIX (ISO/IEC 9945-1: 2003 - mặc dù tiêu chuẩn POSIX là IEEE 1003.1-2008). –

1

Đa luồng (hoặc đa xử lý) chắc chắn đã xuất hiện trước đó. Tuy nhiên, hỗ trợ đa luồng trong một ngôn ngữ lập trình là khan hiếm ngay cả bây giờ, đặc biệt là C không có. Vì vậy, tôi nghĩ bạn nên đọc một cuốn sách trên ví dụ. Các chủ đề POSIX, hoặc bất kỳ luồng hỗ trợ nào mà môi trường của bạn cung cấp cho bạn (các thư viện luồng rất giống với các thư viện ngày nay, ít nhất là trong nguyên tắc đồng bộ hóa nguyên thủy của chúng, những thứ lạ như RCU chỉ được sử dụng trong các môi trường cụ thể).

1

Nó đề cập đến nó trên bản sao của tôi (2nd edition), trong chương Giới thiệu (. P 2):

Tương tự như vậy, C chỉ cung cấp đơn giản, sợi đơn dòng điều khiển: kiểm tra, vòng, nhóm , và chương trình con, nhưng không lập trình đa chương trình, hoạt động song song, đồng bộ hóa hoặc coroutines.

2

Ngôn ngữ C và C++ không bao gồm thư viện luồng được tích hợp sẵn. Do đó, các nền tảng khác nhau có các luồng mô hình khác nhau (PThreads, hàm WinAPI CreateThread (..), các chuỗi MFC, v.v.).

C++ 0x will include a standard thread library, có vẻ như vậy.